{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Assignment 2\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1. 复习上课内容以及复现课程代码"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在本部分，你需要在复习上课内容和课程代码后，复现课程代码。 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.1 路径搜索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 正则表达式\n",
    "import re"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 城市坐标信息\n",
    "coordination_source = \"\"\"\n",
    "{name:'兰州', geoCoord:[103.73, 36.03]},\n",
    "{name:'嘉峪关', geoCoord:[98.17, 39.47]},\n",
    "{name:'西宁', geoCoord:[101.74, 36.56]},\n",
    "{name:'成都', geoCoord:[104.06, 30.67]},\n",
    "{name:'石家庄', geoCoord:[114.48, 38.03]},\n",
    "{name:'拉萨', geoCoord:[102.73, 25.04]},\n",
    "{name:'贵阳', geoCoord:[106.71, 26.57]},\n",
    "{name:'武汉', geoCoord:[114.31, 30.52]},\n",
    "{name:'郑州', geoCoord:[113.65, 34.76]},\n",
    "{name:'济南', geoCoord:[117, 36.65]},\n",
    "{name:'南京', geoCoord:[118.78, 32.04]},\n",
    "{name:'合肥', geoCoord:[117.27, 31.86]},\n",
    "{name:'杭州', geoCoord:[120.19, 30.26]},\n",
    "{name:'南昌', geoCoord:[115.89, 28.68]},\n",
    "{name:'福州', geoCoord:[119.3, 26.08]},\n",
    "{name:'广州', geoCoord:[113.23, 23.16]},\n",
    "{name:'长沙', geoCoord:[113, 28.21]},\n",
    "//{name:'海口', geoCoord:[110.35, 20.02]},\n",
    "{name:'沈阳', geoCoord:[123.38, 41.8]},\n",
    "{name:'长春', geoCoord:[125.35, 43.88]},\n",
    "{name:'哈尔滨', geoCoord:[126.63, 45.75]},\n",
    "{name:'太原', geoCoord:[112.53, 37.87]},\n",
    "{name:'西安', geoCoord:[108.95, 34.27]},\n",
    "//{name:'台湾', geoCoord:[121.30, 25.03]},\n",
    "{name:'北京', geoCoord:[116.46, 39.92]},\n",
    "{name:'上海', geoCoord:[121.48, 31.22]},\n",
    "{name:'重庆', geoCoord:[106.54, 29.59]},\n",
    "{name:'天津', geoCoord:[117.2, 39.13]},\n",
    "{name:'呼和浩特', geoCoord:[111.65, 40.82]},\n",
    "{name:'南宁', geoCoord:[108.33, 22.84]},\n",
    "//{name:'西藏', geoCoord:[91.11, 29.97]},\n",
    "{name:'银川', geoCoord:[106.27, 38.47]},\n",
    "{name:'乌鲁木齐', geoCoord:[87.68, 43.77]},\n",
    "{name:'香港', geoCoord:[114.17, 22.28]},\n",
    "{name:'澳门', geoCoord:[113.54, 22.19]}\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 利用正则表达式提取城市坐标\n",
    "def get_city_info(city_coordination):\n",
    "    city_location = {}\n",
    "    for line in city_coordination.split(\"\\n\"):\n",
    "        if line.startswith(\"//\"): continue\n",
    "        if line.strip() == \"\":continue\n",
    "            \n",
    "        city = re.findall(\"name:'(\\w+)'\",line)[0]\n",
    "        x_y = re.findall(\"Coord:\\[(\\d+.\\d+),\\s(\\d+.\\d+)\\]\",line)[0]\n",
    "        x_y = tuple(map(float,x_y))\n",
    "        city_location[city] = x_y\n",
    "    return city_location"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "city_info = get_city_info(coordination_source)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'兰州': (103.73, 36.03),\n",
       " '嘉峪关': (98.17, 39.47),\n",
       " '西宁': (101.74, 36.56),\n",
       " '成都': (104.06, 30.67),\n",
       " '石家庄': (114.48, 38.03),\n",
       " '拉萨': (102.73, 25.04),\n",
       " '贵阳': (106.71, 26.57),\n",
       " '武汉': (114.31, 30.52),\n",
       " '郑州': (113.65, 34.76),\n",
       " '济南': (117.0, 36.65),\n",
       " '南京': (118.78, 32.04),\n",
       " '合肥': (117.27, 31.86),\n",
       " '杭州': (120.19, 30.26),\n",
       " '南昌': (115.89, 28.68),\n",
       " '福州': (119.3, 26.08),\n",
       " '广州': (113.23, 23.16),\n",
       " '长沙': (113.0, 28.21),\n",
       " '沈阳': (123.38, 41.8),\n",
       " '长春': (125.35, 43.88),\n",
       " '哈尔滨': (126.63, 45.75),\n",
       " '太原': (112.53, 37.87),\n",
       " '西安': (108.95, 34.27),\n",
       " '北京': (116.46, 39.92),\n",
       " '上海': (121.48, 31.22),\n",
       " '重庆': (106.54, 29.59),\n",
       " '天津': (117.2, 39.13),\n",
       " '呼和浩特': (111.65, 40.82),\n",
       " '南宁': (108.33, 22.84),\n",
       " '银川': (106.27, 38.47),\n",
       " '乌鲁木齐': (87.68, 43.77),\n",
       " '香港': (114.17, 22.28),\n",
       " '澳门': (113.54, 22.19)}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "city_info"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 计算城市距离\n",
    "import math"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def geo_distance(origin, destination):\n",
    "    \"\"\"\n",
    "    Calculate the Haversine distance.\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    origin : tuple of float\n",
    "        (lat, long)\n",
    "    destination : tuple of float\n",
    "        (lat, long)\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    distance_in_km : float\n",
    "\n",
    "    Examples\n",
    "    --------\n",
    "    >>> origin = (48.1372, 11.5756)  # Munich\n",
    "    >>> destination = (52.5186, 13.4083)  # Berlin\n",
    "    >>> round(distance(origin, destination), 1)\n",
    "    504.2\n",
    "    \"\"\"\n",
    "    lat1, lon1 = origin\n",
    "    lat2, lon2 = destination\n",
    "    radius = 6371  # km\n",
    "\n",
    "    dlat = math.radians(lat2 - lat1)\n",
    "    dlon = math.radians(lon2 - lon1)\n",
    "    a = (math.sin(dlat / 2) * math.sin(dlat / 2) +\n",
    "         math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) *\n",
    "         math.sin(dlon / 2) * math.sin(dlon / 2))\n",
    "    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))\n",
    "    d = radius * c\n",
    "\n",
    "    return d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_city_distance(city1,city2):\n",
    "    return geo_distance(city_info[city1],city_info[city2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "153.5185697155768"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "get_city_distance(\"杭州\",\"上海\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "776.4154006857316"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "get_city_distance(\"沈阳\",\"北京\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 绘制城市连接图\n",
    "import networkx as nx\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 设置节点\n",
    "city_graph = nx.Graph()\n",
    "city_graph.add_nodes_from(list(city_info.keys()))\n",
    "# 绘制节点地图\n",
    "nx.draw(city_graph, city_info, with_labels=True, node_size=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 建立城市连接（距离小于700km）\n",
    "from collections import defaultdict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 连接阈值(距离=700)\n",
    "threshold = 700   # defined the threshold\n",
    "\n",
    "def build_connection(city_info):\n",
    "    cities_connection = defaultdict(list)\n",
    "    cities = list(city_info.keys())\n",
    "    for c1 in cities:\n",
    "        for c2 in cities:\n",
    "            if c1 == c2 : continue\n",
    "            \n",
    "            if get_city_distance(c1,c2) < threshold:\n",
    "                cities_connection[c1].append(c2)\n",
    "    return cities_connection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(list,\n",
       "            {'兰州': ['嘉峪关', '西宁', '成都', '拉萨', '贵阳', '西安', '重庆', '南宁', '银川'],\n",
       "             '嘉峪关': ['兰州', '西宁', '成都', '拉萨'],\n",
       "             '西宁': ['兰州', '嘉峪关', '成都', '拉萨', '贵阳', '重庆', '银川'],\n",
       "             '成都': ['兰州', '嘉峪关', '西宁', '拉萨', '贵阳', '西安', '重庆', '南宁', '银川'],\n",
       "             '石家庄': ['武汉',\n",
       "              '郑州',\n",
       "              '济南',\n",
       "              '南京',\n",
       "              '合肥',\n",
       "              '南昌',\n",
       "              '广州',\n",
       "              '长沙',\n",
       "              '太原',\n",
       "              '西安',\n",
       "              '北京',\n",
       "              '天津',\n",
       "              '呼和浩特'],\n",
       "             '拉萨': ['兰州', '嘉峪关', '西宁', '成都', '贵阳', '重庆', '南宁', '银川'],\n",
       "             '贵阳': ['兰州', '西宁', '成都', '拉萨', '西安', '重庆', '南宁', '银川'],\n",
       "             '武汉': ['石家庄',\n",
       "              '郑州',\n",
       "              '济南',\n",
       "              '南京',\n",
       "              '合肥',\n",
       "              '杭州',\n",
       "              '南昌',\n",
       "              '福州',\n",
       "              '广州',\n",
       "              '长沙',\n",
       "              '太原',\n",
       "              '西安',\n",
       "              '北京',\n",
       "              '天津',\n",
       "              '呼和浩特',\n",
       "              '香港',\n",
       "              '澳门'],\n",
       "             '郑州': ['石家庄',\n",
       "              '武汉',\n",
       "              '济南',\n",
       "              '南京',\n",
       "              '合肥',\n",
       "              '南昌',\n",
       "              '广州',\n",
       "              '长沙',\n",
       "              '太原',\n",
       "              '西安',\n",
       "              '北京',\n",
       "              '天津',\n",
       "              '呼和浩特',\n",
       "              '香港',\n",
       "              '澳门'],\n",
       "             '济南': ['石家庄',\n",
       "              '武汉',\n",
       "              '郑州',\n",
       "              '南京',\n",
       "              '合肥',\n",
       "              '杭州',\n",
       "              '南昌',\n",
       "              '福州',\n",
       "              '长沙',\n",
       "              '太原',\n",
       "              '北京',\n",
       "              '上海',\n",
       "              '天津',\n",
       "              '呼和浩特'],\n",
       "             '南京': ['石家庄',\n",
       "              '武汉',\n",
       "              '郑州',\n",
       "              '济南',\n",
       "              '合肥',\n",
       "              '杭州',\n",
       "              '南昌',\n",
       "              '福州',\n",
       "              '长沙',\n",
       "              '北京',\n",
       "              '上海',\n",
       "              '天津'],\n",
       "             '合肥': ['石家庄',\n",
       "              '武汉',\n",
       "              '郑州',\n",
       "              '济南',\n",
       "              '南京',\n",
       "              '杭州',\n",
       "              '南昌',\n",
       "              '福州',\n",
       "              '广州',\n",
       "              '长沙',\n",
       "              '太原',\n",
       "              '北京',\n",
       "              '上海',\n",
       "              '天津',\n",
       "              '香港',\n",
       "              '澳门'],\n",
       "             '杭州': ['武汉', '济南', '南京', '合肥', '南昌', '福州', '北京', '上海', '天津'],\n",
       "             '南昌': ['石家庄',\n",
       "              '武汉',\n",
       "              '郑州',\n",
       "              '济南',\n",
       "              '南京',\n",
       "              '合肥',\n",
       "              '杭州',\n",
       "              '福州',\n",
       "              '广州',\n",
       "              '长沙',\n",
       "              '太原',\n",
       "              '北京',\n",
       "              '上海',\n",
       "              '天津',\n",
       "              '香港',\n",
       "              '澳门'],\n",
       "             '福州': ['武汉',\n",
       "              '济南',\n",
       "              '南京',\n",
       "              '合肥',\n",
       "              '杭州',\n",
       "              '南昌',\n",
       "              '广州',\n",
       "              '上海',\n",
       "              '香港',\n",
       "              '澳门'],\n",
       "             '广州': ['石家庄',\n",
       "              '武汉',\n",
       "              '郑州',\n",
       "              '合肥',\n",
       "              '南昌',\n",
       "              '福州',\n",
       "              '长沙',\n",
       "              '太原',\n",
       "              '西安',\n",
       "              '南宁',\n",
       "              '香港',\n",
       "              '澳门'],\n",
       "             '长沙': ['石家庄',\n",
       "              '武汉',\n",
       "              '郑州',\n",
       "              '济南',\n",
       "              '南京',\n",
       "              '合肥',\n",
       "              '南昌',\n",
       "              '广州',\n",
       "              '太原',\n",
       "              '西安',\n",
       "              '北京',\n",
       "              '天津',\n",
       "              '呼和浩特',\n",
       "              '南宁',\n",
       "              '香港',\n",
       "              '澳门'],\n",
       "             '沈阳': ['长春', '哈尔滨', '上海'],\n",
       "             '长春': ['沈阳', '哈尔滨'],\n",
       "             '哈尔滨': ['沈阳', '长春'],\n",
       "             '太原': ['石家庄',\n",
       "              '武汉',\n",
       "              '郑州',\n",
       "              '济南',\n",
       "              '合肥',\n",
       "              '南昌',\n",
       "              '广州',\n",
       "              '长沙',\n",
       "              '西安',\n",
       "              '北京',\n",
       "              '天津',\n",
       "              '呼和浩特',\n",
       "              '银川',\n",
       "              '澳门'],\n",
       "             '西安': ['兰州',\n",
       "              '成都',\n",
       "              '石家庄',\n",
       "              '贵阳',\n",
       "              '武汉',\n",
       "              '郑州',\n",
       "              '广州',\n",
       "              '长沙',\n",
       "              '太原',\n",
       "              '重庆',\n",
       "              '呼和浩特',\n",
       "              '南宁',\n",
       "              '银川'],\n",
       "             '北京': ['石家庄',\n",
       "              '武汉',\n",
       "              '郑州',\n",
       "              '济南',\n",
       "              '南京',\n",
       "              '合肥',\n",
       "              '杭州',\n",
       "              '南昌',\n",
       "              '长沙',\n",
       "              '太原',\n",
       "              '天津',\n",
       "              '呼和浩特'],\n",
       "             '上海': ['济南', '南京', '合肥', '杭州', '南昌', '福州', '沈阳', '天津'],\n",
       "             '重庆': ['兰州', '西宁', '成都', '拉萨', '贵阳', '西安', '呼和浩特', '南宁', '银川'],\n",
       "             '天津': ['石家庄',\n",
       "              '武汉',\n",
       "              '郑州',\n",
       "              '济南',\n",
       "              '南京',\n",
       "              '合肥',\n",
       "              '杭州',\n",
       "              '南昌',\n",
       "              '长沙',\n",
       "              '太原',\n",
       "              '北京',\n",
       "              '上海',\n",
       "              '呼和浩特'],\n",
       "             '呼和浩特': ['石家庄',\n",
       "              '武汉',\n",
       "              '郑州',\n",
       "              '济南',\n",
       "              '长沙',\n",
       "              '太原',\n",
       "              '西安',\n",
       "              '北京',\n",
       "              '重庆',\n",
       "              '天津',\n",
       "              '银川'],\n",
       "             '南宁': ['兰州',\n",
       "              '成都',\n",
       "              '拉萨',\n",
       "              '贵阳',\n",
       "              '广州',\n",
       "              '长沙',\n",
       "              '西安',\n",
       "              '重庆',\n",
       "              '银川',\n",
       "              '香港',\n",
       "              '澳门'],\n",
       "             '银川': ['兰州',\n",
       "              '西宁',\n",
       "              '成都',\n",
       "              '拉萨',\n",
       "              '贵阳',\n",
       "              '太原',\n",
       "              '西安',\n",
       "              '重庆',\n",
       "              '呼和浩特',\n",
       "              '南宁'],\n",
       "             '香港': ['武汉', '郑州', '合肥', '南昌', '福州', '广州', '长沙', '南宁', '澳门'],\n",
       "             '澳门': ['武汉',\n",
       "              '郑州',\n",
       "              '合肥',\n",
       "              '南昌',\n",
       "              '福州',\n",
       "              '广州',\n",
       "              '长沙',\n",
       "              '太原',\n",
       "              '南宁',\n",
       "              '香港']})"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 建立城市间连接\n",
    "cities_connection = build_connection(city_info)\n",
    "cities_connection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 删除 沈阳-上海 连接\n",
    "cities_connection['沈阳'].remove('上海')\n",
    "cities_connection['上海'].remove('沈阳')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 增加 北京-沈阳 连接\n",
    "cities_connection['沈阳'].append('北京')\n",
    "cities_connection['北京'].append('沈阳')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制城市连接图\n",
    "cities_connection_graph = nx.Graph(cities_connection)\n",
    "nx.draw(cities_connection_graph,city_info,with_labels=True,node_size=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**BFS广度优先搜索**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "def search_1(graph,start,destination):\n",
    "    pathes = [[start]]  # list 用来存储待搜索路径\n",
    "    visited = set() # set用来存储已搜索的节点\n",
    "    \n",
    "    while pathes:\n",
    "        path = pathes.pop(0)  #提取第一条路径\n",
    "        froniter = path[-1]   #提取即将要探索的节点\n",
    "        \n",
    "        if froniter in visited: continue  #检查如果该点已经探索过 则不用再探索\n",
    "            \n",
    "        successsors = graph[froniter]\n",
    "        \n",
    "        for city in successsors:      #遍历子节点\n",
    "            if city in path: continue  # check loop #检查会不会形成环\n",
    "            \n",
    "            new_path = path+[city]\n",
    "            #将新路径加到list里面\n",
    "            #bfs\n",
    "            pathes.append(new_path) \n",
    "            #dfs\n",
    "            #pathes = [new_path] + pathes \n",
    "            \n",
    "            if city == destination:  #检查目的地是不是已经搜索到了\n",
    "                return new_path\n",
    "        visited.add(froniter)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['上海', '合肥', '香港']"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "search_1(cities_connection,\"上海\",\"香港\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**BFS最优搜索**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 带排序策略的广度优先搜索\n",
    "def search_2(graph,start,destination,search_strategy):\n",
    "    pathes = [[start]]\n",
    "    visited = set()# ！\n",
    "    while pathes:\n",
    "        path = pathes.pop(0)\n",
    "        froniter = path[-1]\n",
    "        if froniter in visited : continue# ！\n",
    "            \n",
    "        if froniter == destination:# ！\n",
    "            return path# ！\n",
    "        \n",
    "        successsors = graph[froniter]\n",
    "        \n",
    "        for city in successsors:\n",
    "            if city in path: continue  # check loop\n",
    "            \n",
    "            new_path = path+[city]\n",
    "            \n",
    "            pathes.append(new_path)  #bfs\n",
    "            \n",
    "        pathes = search_strategy(pathes)\n",
    "        visited.add(froniter) # ！\n",
    "       # if pathes and (destination == pathes[0][-1]):\n",
    "       #     return pathes[0]  \n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将路径按照距离排序\n",
    "def sort_by_distance(pathes):\n",
    "    def get_distance_of_path(path):\n",
    "        distance = 0\n",
    "        for i,_ in enumerate(path[:-1]):\n",
    "            distance += get_city_distance(path[i],path[i+1])\n",
    "        return distance\n",
    "    return sorted(pathes,key=get_distance_of_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['北京', '济南', '上海']"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 无排序策略搜索\n",
    "search_2(cities_connection,\"北京\",\"上海\",search_strategy=lambda x:x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['北京', '天津', '上海']"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#按照路径距离排序的搜索策略\n",
    "search_2(cities_connection,\"北京\",\"上海\",search_strategy=sort_by_distance)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 计算路径距离\n",
    "def get_distance_of_path(path):\n",
    "    distance = 0\n",
    "    for i,_ in enumerate(path[:-1]):\n",
    "        distance += get_city_distance(path[i],path[i+1])\n",
    "    return distance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "752.66259009181"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 比较路径距离-常规BFS\n",
    "get_distance_of_path([\"北京\",\"济南\",\"上海\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "732.5085345714293"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 比较路径距离-排序BFS\n",
    "get_distance_of_path([\"北京\",\"天津\",\"上海\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.2 线性回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_boston\n",
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',\n",
       "       'TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 波士顿房价数据集\n",
    "dataset = load_boston()\n",
    "dataset.feature_names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(506, 13) (506,)\n"
     ]
    }
   ],
   "source": [
    "x,y=dataset['data'],dataset['target']\n",
    "print(x.shape,y.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 只取第5列特征-'RM' 房间数量\n",
    "X_rm = x[:,5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x213708ffb38>"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 房间数量于房价分布\n",
    "# plot the RM with respect to y\n",
    "plt.scatter(X_rm,y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**梯度下降**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "定义目标函数为线性函数 y=kx+b\n",
    "$$ y = k*rm + b$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "#define target function\n",
    "def price(rm, k, b):\n",
    "    return k * rm + b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "定义损失函数为均方误差\n",
    "$$ loss = \\frac{1}{n} \\sum{(y_i - \\hat{y_i})}^2 = \\frac{1}{n} \\sum{(y_i - (kx_i + b_i))}^2 $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "# define loss function \n",
    "def loss(y,y_hat):\n",
    "    return sum((y_i - y_hat_i)**2 for y_i, y_hat_i in zip(list(y),list(y_hat)))/len(list(y))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "定义对目标函数参数k,b的偏微分梯度计算\n",
    "$$ \\frac{\\partial{loss}}{\\partial{k}} = -\\frac{2}{n}\\sum(y_i - \\hat{y_i})x_i$$\n",
    "$$ \\frac{\\partial{loss}}{\\partial{b}} = -\\frac{2}{n}\\sum(y_i - \\hat{y_i})$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "# define partial derivative \n",
    "def partial_derivative_k(x, y, y_hat): \n",
    "    n = len(y)\n",
    "    gradient = 0\n",
    "    for x_i, y_i, y_hat_i in zip(list(x),list(y),list(y_hat)):\n",
    "        gradient += (y_i-y_hat_i) * x_i\n",
    "    return -2/n * gradient\n",
    "\n",
    "def partial_derivative_b(y, y_hat):\n",
    "    n = len(y)\n",
    "    gradient = 0\n",
    "    for y_i, y_hat_i in zip(list(y),list(y_hat)):\n",
    "        gradient += (y_i-y_hat_i)\n",
    "    return -2 / n * gradient"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "按批次训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration 0, the loss is 5035.898306134062, parameters k is -6.428247092574438 and b is -6.87820812249565\n",
      "Iteration 1, the loss is 4252.831269597484, parameters k is -5.535480496782228 and b is -6.738587728145663\n",
      "Iteration 2, the loss is 3592.856532376038, parameters k is -4.715871093633261 and b is -6.610467997879965\n",
      "Iteration 3, the loss is 3036.6248900994797, parameters k is -3.9634233147428737 and b is -6.492906397953252\n",
      "Iteration 4, the loss is 2567.8286910529196, parameters k is -3.2726329561469587 and b is -6.3850376395981945\n",
      "Iteration 5, the loss is 2172.723726463487, parameters k is -2.638446908726449 and b is -6.286067348444013\n",
      "Iteration 6, the loss is 1839.726276118394, parameters k is -2.0562261889088425 and b is -6.195266252755335\n",
      "Iteration 7, the loss is 1559.0734954490513, parameters k is -1.521711999173868 and b is -6.111964847971623\n",
      "Iteration 8, the loss is 1322.5371872684036, parameters k is -1.0309945700568983 and b is -6.035548498512151\n",
      "Iteration 9, the loss is 1123.1825664865644, parameters k is -0.5804845556935752 and b is -5.9654529410106\n",
      "Iteration 10, the loss is 955.1649452393983, parameters k is -0.16688677363118365 and b is -5.90116015608028\n",
      "Iteration 11, the loss is 813.5583776199521, parameters k is 0.21282390321665928 and b is -5.8421945784071845\n",
      "Iteration 12, the loss is 694.2112401981392, parameters k is 0.5614246788500655 and b is -5.7881196174433605\n",
      "Iteration 13, the loss is 593.6245142208584, parameters k is 0.8814651526207302 and b is -5.738534463245471\n",
      "Iteration 14, the loss is 508.8492009552596, parameters k is 1.1752859724803 and b is -5.6930711540895835\n",
      "Iteration 15, the loss is 437.39986258577835, parameters k is 1.445035959509194 and b is -5.651391884408427\n",
      "Iteration 16, the loss is 377.1817538464254, parameters k is 1.6926878290114833 and b is -5.613186533355571\n",
      "Iteration 17, the loss is 326.42940802469474, parameters k is 1.9200526231936967 and b is -5.578170395915153\n",
      "Iteration 18, the loss is 283.6548767940874, parameters k is 2.1287929610191796 and b is -5.546082099957598\n",
      "Iteration 19, the loss is 247.6041063643834, parameters k is 2.320435202175911 and b is -5.516681694002209\n",
      "Iteration 20, the loss is 217.22017098032453, parameters k is 2.496380614151182 and b is -5.489748891696416\n",
      "Iteration 21, the loss is 191.61228584397136, parameters k is 2.6579156241131137 and b is -5.465081460168028\n",
      "Iteration 22, the loss is 170.02969097782164, parameters k is 2.806221230603302 and b is -5.442493740459432\n",
      "Iteration 23, the loss is 151.8396403526159, parameters k is 2.9423816438979453 and b is -5.421815289219024\n",
      "Iteration 24, the loss is 136.50885096241336, parameters k is 3.067392218251607 and b is -5.402889631712273\n",
      "Iteration 25, the loss is 123.58786796866137, parameters k is 3.1821667340571027 and b is -5.385573117029265\n",
      "Iteration 26, the loss is 112.69788752865706, parameters k is 3.2875440831988714 and b is -5.36973386711327\n",
      "Iteration 27, the loss is 103.5196509784853, parameters k is 3.3842944065108704 and b is -5.355250811921235\n",
      "Iteration 28, the loss is 95.7840847687407, parameters k is 3.4731247282415545 and b is -5.342012803657332\n",
      "Iteration 29, the loss is 89.26441173352777, parameters k is 3.554684128748517 and b is -5.329917803599134\n",
      "Iteration 30, the loss is 83.7695024099743, parameters k is 3.6295684932670027 and b is -5.318872135567127\n",
      "Iteration 31, the loss is 79.13827148142565, parameters k is 3.698324871494987 and b is -5.30878980057584\n",
      "Iteration 32, the loss is 75.2349550585708, parameters k is 3.761455479890193 and b is -5.299591847652459\n",
      "Iteration 33, the loss is 71.94513033724769, parameters k is 3.8194213759604554 and b is -5.291205796219754\n",
      "Iteration 34, the loss is 69.17236093677573, parameters k is 3.8726458314290717 and b is -5.283565105817388\n",
      "Iteration 35, the loss is 66.83536956643538, parameters k is 3.921517428953737 and b is -5.276608689281999\n",
      "Iteration 36, the loss is 64.8656551279893, parameters k is 3.9663929050551077 and b is -5.270280465824418\n",
      "Iteration 37, the loss is 63.205484392165005, parameters k is 4.007599760054285 and b is -5.264528950734262\n",
      "Iteration 38, the loss is 61.80619936882806, parameters k is 4.045438654113917 and b is -5.259306878710132\n",
      "Iteration 39, the loss is 60.6267907461186, parameters k is 4.080185606912694 and b is -5.254570858059623\n",
      "Iteration 40, the loss is 59.6326955744661, parameters k is 4.112094017046412 and b is -5.250281053239244\n",
      "Iteration 41, the loss is 58.794783945836045, parameters k is 4.141396515929814 and b is -5.246400893411651\n",
      "Iteration 42, the loss is 58.08850495954942, parameters k is 4.168306669762644 and b is -5.242896804887949\n",
      "Iteration 43, the loss is 57.49316693599497, parameters k is 4.19302054201176 and b is -5.239737965497588\n",
      "Iteration 44, the loss is 56.99133077545331, parameters k is 4.215718127840635 and b is -5.236896079088771\n",
      "Iteration 45, the loss is 56.56829867645379, parameters k is 4.236564670980769 and b is -5.234345168509591\n",
      "Iteration 46, the loss is 56.21168322384625, parameters k is 4.255711872679425 and b is -5.232061385555322\n",
      "Iteration 47, the loss is 55.9110442130594, parameters k is 4.2732990015685335 and b is -5.230022836491394\n",
      "Iteration 48, the loss is 55.6575825629149, parameters k is 4.289453912574731 and b is -5.228209421875578\n",
      "Iteration 49, the loss is 55.44388234309728, parameters k is 4.3042939823250395 and b is -5.226602689507461\n",
      "Iteration 50, the loss is 55.263693353008435, parameters k is 4.317926967891736 and b is -5.225185699429407\n",
      "Iteration 51, the loss is 55.111747877627366, parameters k is 4.330451795159134 and b is -5.2239428999912985\n",
      "Iteration 52, the loss is 54.98360624800126, parameters k is 4.341959282580082 and b is -5.222860014072348\n",
      "Iteration 53, the loss is 54.87552667849261, parameters k is 4.352532805617276 and b is -5.22192393462755\n",
      "Iteration 54, the loss is 54.784355564653026, parameters k is 4.362248906730559 and b is -5.221122628794592\n",
      "Iteration 55, the loss is 54.70743502546538, parameters k is 4.37117785537295 and b is -5.220445049859634\n",
      "Iteration 56, the loss is 54.642524979265076, parameters k is 4.379384162092417 and b is -5.219881056437909\n",
      "Iteration 57, the loss is 54.58773746875419, parameters k is 4.386927050500654 and b is -5.219421338277831\n",
      "Iteration 58, the loss is 54.541481309640055, parameters k is 4.393860890561839 and b is -5.219057348145815\n",
      "Iteration 59, the loss is 54.50241544010071, parameters k is 4.400235596371376 and b is -5.218781239293432\n",
      "Iteration 60, the loss is 54.469409603371886, parameters k is 4.4060969913348575 and b is -5.218585808049434\n",
      "Iteration 61, the loss is 54.441511210741936, parameters k is 4.411487143418913 and b is -5.218464441116614\n",
      "Iteration 62, the loss is 54.41791741344021, parameters k is 4.416444672926717 and b is -5.218411067187941\n",
      "Iteration 63, the loss is 54.39795156461931, parameters k is 4.421005035049875 and b is -5.2184201125279674\n",
      "Iteration 64, the loss is 54.381043381340966, parameters k is 4.42520077926388 and b is -5.2184864601945495\n",
      "Iteration 65, the loss is 54.36671222495136, parameters k is 4.429061787464924 and b is -5.2186054126025345\n",
      "Iteration 66, the loss is 54.35455300965859, parameters k is 4.432615492590296 and b is -5.218772657155523\n",
      "Iteration 67, the loss is 54.3442243261789, parameters k is 4.435887079321831 and b is -5.218984234694274\n",
      "Iteration 68, the loss is 54.33543843225703, parameters k is 4.438899668340796 and b is -5.219236510530894\n",
      "Iteration 69, the loss is 54.327952816604764, parameters k is 4.441674485482233 and b is -5.2195261478569295\n",
      "Iteration 70, the loss is 54.321563088924606, parameters k is 4.4442310170263255 and b is -5.219850083330764\n",
      "Iteration 71, the loss is 54.31609698757112, parameters k is 4.446587152262926 and b is -5.220205504665759\n",
      "Iteration 72, the loss is 54.311409329162615, parameters k is 4.448759314372264 and b is -5.220589830055142\n",
      "Iteration 73, the loss is 54.30737775207739, parameters k is 4.450762580579376 and b is -5.221000689283121\n",
      "Iteration 74, the loss is 54.30389912904061, parameters k is 4.452610792461324 and b is -5.221435906384029\n",
      "Iteration 75, the loss is 54.30088654362673, parameters k is 4.45431665721424 and b is -5.221893483722631\n",
      "Iteration 76, the loss is 54.298266742032865, parameters k is 4.4558918406210575 and b is -5.22237158737913\n",
      "Iteration 77, the loss is 54.2959779854154, parameters k is 4.45734705240012 and b is -5.222868533731925\n",
      "Iteration 78, the loss is 54.29396823982256, parameters k is 4.458692124559072 and b is -5.22338277713999\n",
      "Iteration 79, the loss is 54.29219365065713, parameters k is 4.459936083327289 and b is -5.223912898634725\n",
      "Iteration 80, the loss is 54.290617256941836, parameters k is 4.461087215193117 and b is -5.224457595538574\n",
      "Iteration 81, the loss is 54.28920790769311, parameters k is 4.462153127529053 and b is -5.225015671934432\n",
      "Iteration 82, the loss is 54.287939348632854, parameters k is 4.463140804248414 and b is -5.225586029916138\n",
      "Iteration 83, the loss is 54.286789452462145, parameters k is 4.464056656900686 and b is -5.226167661556029\n",
      "Iteration 84, the loss is 54.28573957013068, parameters k is 4.464906571579376 and b is -5.226759641530784\n",
      "Iteration 85, the loss is 54.2847739840814, parameters k is 4.465695951985542 and b is -5.227361120351623\n",
      "Iteration 86, the loss is 54.28387944744161, parameters k is 4.466429758962081 and b is -5.227971318149311\n",
      "Iteration 87, the loss is 54.28304479564924, parameters k is 4.46711254678799 and b is -5.228589518968519\n",
      "Iteration 88, the loss is 54.2822606191293, parameters k is 4.467748496498148 and b is -5.2292150655297895\n",
      "Iteration 89, the loss is 54.28151898742245, parameters k is 4.468341446472389 and b is -5.229847354420771\n",
      "Iteration 90, the loss is 54.28081321667912, parameters k is 4.468894920517664 and b is -5.230485831681568\n",
      "Iteration 91, the loss is 54.28013767370177, parameters k is 4.469412153648728 and b is -5.231129988751878\n",
      "Iteration 92, the loss is 54.27948761078948, parameters k is 4.469896115755999 and b is -5.23177935875029\n",
      "Iteration 93, the loss is 54.2788590265451, parameters k is 4.470349533333712 and b is -5.232433513058509\n",
      "Iteration 94, the loss is 54.27824854856148, parameters k is 4.470774909427357 and b is -5.2330920581855125\n",
      "Iteration 95, the loss is 54.27765333454886, parameters k is 4.471174541946334 and b is -5.233754632888713\n",
      "Iteration 96, the loss is 54.277070989004315, parameters k is 4.4715505404757945 and b is -5.23442090553105\n",
      "Iteration 97, the loss is 54.27649949298024, parameters k is 4.471904841710687 and b is -5.235090571654678\n",
      "Iteration 98, the loss is 54.275937144892545, parameters k is 4.472239223624902 and b is -5.235763351753507\n",
      "Iteration 99, the loss is 54.275382510633385, parameters k is 4.4725553184791895 and b is -5.236438989228291\n",
      "Iteration 100, the loss is 54.27483438152595, parameters k is 4.472854624763028 and b is -5.237117248509308\n",
      "Iteration 101, the loss is 54.274291738888635, parameters k is 4.473138518157791 and b is -5.23779791333289\n",
      "Iteration 102, the loss is 54.27375372416842, parameters k is 4.4734082616014375 and b is -5.238480785159207\n",
      "Iteration 103, the loss is 54.27321961377075, parameters k is 4.473665014528355 and b is -5.239165681719715\n",
      "Iteration 104, the loss is 54.27268879784434, parameters k is 4.473909841351952 and b is -5.239852435683649\n",
      "Iteration 105, the loss is 54.27216076240192, parameters k is 4.474143719252065 and b is -5.2405408934338045\n",
      "Iteration 106, the loss is 54.271635074251236, parameters k is 4.474367545324151 and b is -5.241230913942647\n",
      "Iteration 107, the loss is 54.27111136829429, parameters k is 4.474582143142573 and b is -5.24192236774053\n",
      "Iteration 108, the loss is 54.27058933682364, parameters k is 4.4747882687859875 and b is -5.242615135968476\n",
      "Iteration 109, the loss is 54.2700687205011, parameters k is 4.474986616368932 and b is -5.243309109508579\n",
      "Iteration 110, the loss is 54.2695493007542, parameters k is 4.475177823120069 and b is -5.244004188185683\n",
      "Iteration 111, the loss is 54.26903089336845, parameters k is 4.475362474044245 and b is -5.24470028003448\n",
      "Iteration 112, the loss is 54.26851334308617, parameters k is 4.475541106202472 and b is -5.245397300626674\n",
      "Iteration 113, the loss is 54.26799651905497, parameters k is 4.4757142126411456 and b is -5.246095172453293\n",
      "Iteration 114, the loss is 54.26748031099134, parameters k is 4.475882245999245 and b is -5.246793824357613\n",
      "Iteration 115, the loss is 54.2669646259472, parameters k is 4.476045621819909 and b is -5.247493191014565\n",
      "Iteration 116, the loss is 54.266449385585126, parameters k is 4.476204721590609 and b is -5.2481932124528035\n",
      "Iteration 117, the loss is 54.26593452388155, parameters k is 4.4763598955341655 and b is -5.248893833615946\n",
      "Iteration 118, the loss is 54.265419985191166, parameters k is 4.4765114651710345 and b is -5.249595003959765\n",
      "Iteration 119, the loss is 54.264905722615595, parameters k is 4.476659725671595 and b is -5.250296677082401\n",
      "Iteration 120, the loss is 54.264391696627975, parameters k is 4.476804948015663 and b is -5.250998810384872\n",
      "Iteration 121, the loss is 54.263877873915135, parameters k is 4.476947380975012 and b is -5.251701364759413\n",
      "Iteration 122, the loss is 54.2633642263999, parameters k is 4.477087252933434 and b is -5.252404304303353\n",
      "Iteration 123, the loss is 54.2628507304187, parameters k is 4.477224773557621 and b is -5.253107596056444\n",
      "Iteration 124, the loss is 54.26233736602727, parameters k is 4.4773601353311205 and b is -5.253811209759717\n",
      "Iteration 125, the loss is 54.26182411641638, parameters k is 4.477493514962573 and b is -5.254515117634096\n",
      "Iteration 126, the loss is 54.26131096741896, parameters k is 4.477625074678537 and b is -5.255219294177163\n",
      "Iteration 127, the loss is 54.26079790709455, parameters k is 4.477754963410364 and b is -5.255923715976574\n",
      "Iteration 128, the loss is 54.26028492537953, parameters k is 4.4778833178838005 and b is -5.256628361538767\n",
      "Iteration 129, the loss is 54.25977201379223, parameters k is 4.4780102636192956 and b is -5.257333211131711\n",
      "Iteration 130, the loss is 54.259259165183664, parameters k is 4.478135915850324 and b is -5.258038246640538\n",
      "Iteration 131, the loss is 54.258746373528744, parameters k is 4.478260380366452 and b is -5.258743451435012\n",
      "Iteration 132, the loss is 54.25823363374907, parameters k is 4.47838375428731 and b is -5.259448810247853\n",
      "Iteration 133, the loss is 54.25772094156454, parameters k is 4.478506126773133 and b is -5.260154309063039\n",
      "Iteration 134, the loss is 54.25720829336737, parameters k is 4.4786275796770685 and b is -5.26085993501326\n",
      "Iteration 135, the loss is 54.25669568611731, parameters k is 4.47874818814403 and b is -5.261565676285773\n",
      "Iteration 136, the loss is 54.25618311725102, parameters k is 4.47886802116046 and b is -5.262271522035979\n",
      "Iteration 137, the loss is 54.25567058460854, parameters k is 4.478987142059056 and b is -5.2629774623080765\n",
      "Iteration 138, the loss is 54.25515808636899, parameters k is 4.47910560898211 and b is -5.26368348796222\n",
      "Iteration 139, the loss is 54.25464562099753, parameters k is 4.479223475306892 and b is -5.264389590607653\n",
      "Iteration 140, the loss is 54.25413318720053, parameters k is 4.479340790036164 and b is -5.265095762541311\n",
      "Iteration 141, the loss is 54.253620783887385, parameters k is 4.479457598156694 and b is -5.265801996691464\n",
      "Iteration 142, the loss is 54.25310841013872, parameters k is 4.47957394096838 and b is -5.26650828656598\n",
      "Iteration 143, the loss is 54.25259606517971, parameters k is 4.4796898563864085 and b is -5.267214626204816\n",
      "Iteration 144, the loss is 54.252083748356874, parameters k is 4.479805379218649 and b is -5.267921010136419\n",
      "Iteration 145, the loss is 54.251571459119496, parameters k is 4.47992054142031 and b is -5.268627433337687\n",
      "Iteration 146, the loss is 54.25105919700313, parameters k is 4.4800353723277295 and b is -5.269333891197218\n",
      "Iteration 147, the loss is 54.250546961616045, parameters k is 4.480149898873002 and b is -5.270040379481569\n",
      "Iteration 148, the loss is 54.25003475262806, parameters k is 4.4802641457810175 and b is -5.27074689430428\n",
      "Iteration 149, the loss is 54.249522569760735, parameters k is 4.480378135750355 and b is -5.27145343209744\n",
      "Iteration 150, the loss is 54.24901041277907, parameters k is 4.480491889619345 and b is -5.272159989585575\n",
      "Iteration 151, the loss is 54.24849828148487, parameters k is 4.480605426518525 and b is -5.272866563761687\n",
      "Iteration 152, the loss is 54.24798617571093, parameters k is 4.480718764010604 and b is -5.273573151865248\n",
      "Iteration 153, the loss is 54.247474095316235, parameters k is 4.480831918218949 and b is -5.274279751362003\n",
      "Iteration 154, the loss is 54.24696204018159, parameters k is 4.4809449039455505 and b is -5.274986359925422\n",
      "Iteration 155, the loss is 54.2464500102064, parameters k is 4.481057734779312 and b is -5.2756929754196795\n",
      "Iteration 156, the loss is 54.245938005305725, parameters k is 4.4811704231954685 and b is -5.276399595884024\n",
      "Iteration 157, the loss is 54.24542602540778, parameters k is 4.481282980646859 and b is -5.277106219518431\n",
      "Iteration 158, the loss is 54.244914070451834, parameters k is 4.481395417647714 and b is -5.277812844670428\n",
      "Iteration 159, the loss is 54.24440214038663, parameters k is 4.481507743850579 and b is -5.278519469823005\n",
      "Iteration 160, the loss is 54.24389023516874, parameters k is 4.481619968116935 and b is -5.27922609358351\n",
      "Iteration 161, the loss is 54.24337835476124, parameters k is 4.481732098582029 and b is -5.279932714673462\n",
      "Iteration 162, the loss is 54.242866499133015, parameters k is 4.481844142714392 and b is -5.280639331919188\n",
      "Iteration 163, the loss is 54.24235466825749, parameters k is 4.481956107370481 and b is -5.2813459442432364\n",
      "Iteration 164, the loss is 54.24184286211222, parameters k is 4.482067998844838 and b is -5.282052550656492\n",
      "Iteration 165, the loss is 54.241331080678, parameters k is 4.482179822916145 and b is -5.282759150250937\n",
      "Iteration 166, the loss is 54.24081932393859, parameters k is 4.4822915848895 and b is -5.283465742192999\n",
      "Iteration 167, the loss is 54.24030759187991, parameters k is 4.482403289635229 and b is -5.28417232571746\n",
      "Iteration 168, the loss is 54.23979588449012, parameters k is 4.482514941624516 and b is -5.284878900121845\n",
      "Iteration 169, the loss is 54.239284201758956, parameters k is 4.482626544962118 and b is -5.285585464761283\n",
      "Iteration 170, the loss is 54.238772543677534, parameters k is 4.482738103416392 and b is -5.286292019043788\n",
      "Iteration 171, the loss is 54.23826091023832, parameters k is 4.482849620446868 and b is -5.286998562425925\n",
      "Iteration 172, the loss is 54.23774930143455, parameters k is 4.482961099229555 and b is -5.287705094408826\n",
      "Iteration 173, the loss is 54.237237717260605, parameters k is 4.483072542680179 and b is -5.288411614534544\n",
      "Iteration 174, the loss is 54.2367261577115, parameters k is 4.483183953475515 and b is -5.289118122382694\n",
      "Iteration 175, the loss is 54.23621462278254, parameters k is 4.483295334072968 and b is -5.28982461756738\n",
      "Iteration 176, the loss is 54.235703112469984, parameters k is 4.483406686728555 and b is -5.290531099734361\n",
      "Iteration 177, the loss is 54.235191626770295, parameters k is 4.483518013513406 and b is -5.291237568558465\n",
      "Iteration 178, the loss is 54.23468016568047, parameters k is 4.483629316328915 and b is -5.291944023741202\n",
      "Iteration 179, the loss is 54.2341687291975, parameters k is 4.483740596920657 and b is -5.292650465008577\n",
      "Iteration 180, the loss is 54.23365731731891, parameters k is 4.483851856891153 and b is -5.293356892109084\n",
      "Iteration 181, the loss is 54.23314593004232, parameters k is 4.483963097711595 and b is -5.294063304811862\n",
      "Iteration 182, the loss is 54.232634567365686, parameters k is 4.48407432073261 and b is -5.294769702905007\n",
      "Iteration 183, the loss is 54.232123229286856, parameters k is 4.484185527194138 and b is -5.29547608619401\n",
      "Iteration 184, the loss is 54.231611915804, parameters k is 4.484296718234509 and b is -5.2961824545003395\n",
      "Iteration 185, the loss is 54.231100626915286, parameters k is 4.484407894898764 and b is -5.296888807660128\n",
      "Iteration 186, the loss is 54.230589362619156, parameters k is 4.484519058146305 and b is -5.297595145522972\n",
      "Iteration 187, the loss is 54.230078122913945, parameters k is 4.4846302088579115 and b is -5.298301467950826\n",
      "Iteration 188, the loss is 54.22956690779802, parameters k is 4.484741347842183 and b is -5.299007774816993\n",
      "Iteration 189, the loss is 54.229055717270064, parameters k is 4.484852475841458 and b is -5.299714066005192\n",
      "Iteration 190, the loss is 54.22854455132851, parameters k is 4.48496359353724 and b is -5.3004203414087065\n",
      "Iteration 191, the loss is 54.228033409972156, parameters k is 4.485074701555188 and b is -5.301126600929598\n",
      "Iteration 192, the loss is 54.22752229319948, parameters k is 4.485185800469688 and b is -5.301832844477987\n",
      "Iteration 193, the loss is 54.227011201009155, parameters k is 4.485296890808059 and b is -5.302539071971397\n",
      "Iteration 194, the loss is 54.22650013339995, parameters k is 4.485407973054409 and b is -5.3032452833341415\n",
      "Iteration 195, the loss is 54.225989090370504, parameters k is 4.4855190476531765 and b is -5.303951478496771\n",
      "Iteration 196, the loss is 54.225478071919675, parameters k is 4.4856301150123805 and b is -5.304657657395561\n",
      "Iteration 197, the loss is 54.22496707804598, parameters k is 4.4857411755066074 and b is -5.305363819972043\n",
      "Iteration 198, the loss is 54.224456108748335, parameters k is 4.485852229479749 and b is -5.306069966172575\n",
      "Iteration 199, the loss is 54.22394516402553, parameters k is 4.48596327724752 and b is -5.306776095947942\n"
     ]
    }
   ],
   "source": [
    "#initialized parameters\n",
    "k = random.random() * 200 - 100  # -100 100\n",
    "b = random.random() * 200 - 100  # -100 100\n",
    "# learning rate\n",
    "learning_rate = 1e-3\n",
    "# iteration times\n",
    "iteration_num = 200 \n",
    "# loss function result\n",
    "losses = []\n",
    "\n",
    "# iterate training\n",
    "for i in range(iteration_num):\n",
    "    # 计算估计 y 值\n",
    "    price_use_current_parameters = [price(r, k, b) for r in X_rm]  # \\hat{y}\n",
    "    # 计算均方误差\n",
    "    current_loss = loss(y, price_use_current_parameters)\n",
    "    losses.append(current_loss)\n",
    "    print(\"Iteration {}, the loss is {}, parameters k is {} and b is {}\".format(i,current_loss,k,b))\n",
    "    # 计算梯度\n",
    "    k_gradient = partial_derivative_k(X_rm, y, price_use_current_parameters)\n",
    "    b_gradient = partial_derivative_b(y, price_use_current_parameters)\n",
    "    # 更新参数\n",
    "    k = k + (-1 * k_gradient) * learning_rate\n",
    "    b = b + (-1 * b_gradient) * learning_rate\n",
    "# 迭代训练结束后的参数    \n",
    "best_k = k\n",
    "best_b = b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x21370974518>]"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制损失函数结果随迭代次数的变化\n",
    "plt.plot(list(range(iteration_num)),losses)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用训练后的参数计算预测 y 值\n",
    "price_use_best_parameters = [price(r, best_k, best_b) for r in X_rm]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x213708ac2e8>"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制 房价 y 与 房间数量 x 的线性关系\n",
    "plt.scatter(X_rm,y)\n",
    "plt.scatter(X_rm,price_use_current_parameters)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2. 回答以下理论题目"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###       < 评阅点 >： 答案是否正确完整"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 2.1 What conditions are required to make the BFS return the optimal solution ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Ans: {\n",
    "1) 任意两个节点之间权重值非负；\n",
    "2) 在每次迭代中为搜索路径排序。\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 2.2 Is there a way to make DFS find the optimal solution ? (You may need to read some material about iterative DFS)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Ans: { \n",
    "    迭代深化深度优先搜索(IDDFS)：\n",
    "    在这个搜索策略中，一个具有深度限制的深度优先搜索算法会不断重复地运行，并且同时放宽对于搜索深度的限制，直到找到目标状态。\n",
    "    IDDFS 与广度优先算法是等价的，因此也可以像BFS一样找到最优解，但对内存的使用会少很多。\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 2.3 In what conditions BFS is a better choice than DFS and vice versa ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Ans: { \n",
    "    广度优先搜索(BFS)：\n",
    "      优点是可以得到最优解；\n",
    "      缺点是在树的层次较深并且子节点个数较多的情况下，消耗内存现象十分严重。\n",
    "      因此，BFS适用于节点的子节点个数不多，并且树的层次不太深的情况。\n",
    "     }"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 2.4 When can we use machine learning ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Ans: { \n",
    "1) 解决分类问题\n",
    "2) 解决回归问题\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 2.5 What is the gradient of a function ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Ans: {\n",
    "    函数梯度的本意是一个向量（矢量），表示某一函数在该点处的方向导数沿着该方向取得最大值，\n",
    "    即函数在该点处沿着该方向（此梯度的方向）变化最快，变化率最大（为该梯度的模）。\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 2.6 How can we find the maximum value of a function using the information of gradient ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Ans: {\n",
    "    梯度为0的点即为函数的极大/小值，梯度下降是求局部极小值,而梯度上升是求局部最大值；\n",
    "    对于一个有极大值的凸函数，它的极大值即为最大值，可以使用梯度上升求解该函数的最大值。\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3. 实践部分  寻找地铁路线"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### < 评阅点 >  1: 爬虫爬取数据是否完整;  2:搜索算法是否正确"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this part, although we recommend you to use Beijing subway, you still can use the subway map of any cities that you are interested in. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![title](img/ditu.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Please using the search policy to implement an agent. This agent receives two input, one is @param start station and the other is @param destination. Your agent should give the optimal route based on Beijing Subway system."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Deadline: 2019-May"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Procedures"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1. Get data from web.  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Some tips: "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "a. You might need this package: requests[https://2.python-requests.org/en/master/] to get webpages"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "b.You might need to use Regular Expression and Beautiful Soap package to parse the webpages"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "安装 python 包\n",
    "```\n",
    "python -m pip install requests\n",
    "python -m pip install beautifulsoup4\n",
    "python -m pip install lxml\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re, requests, lxml\n",
    "from bs4 import BeautifulSoup"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 获取某城市地铁站点链接信息\n",
    "def get_station_info(city_str='bj'):\n",
    "    # 建立站点连接关系\n",
    "    station_connections = dict()\n",
    "    line_names = []\n",
    "    # 获取城市链接\n",
    "    city_str='bj'\n",
    "    all_url = 'https://dt.8684.cn/'\n",
    "    city_url = all_url+city_str\n",
    "    r1 = requests.get(city_url)\n",
    "    text1 = r1.text.encode(r1.encoding).decode('utf8')\n",
    "    soup1 = BeautifulSoup(markup=text1, features='lxml')\n",
    "\n",
    "    # 找到地铁线路链接\n",
    "    all_a = soup1.find(name='div',attrs='ib-box').find_all('a',class_=re.compile('line'))\n",
    "    # print(all_a)\n",
    "    # 地铁线路数量\n",
    "    lineNum = len(all_a)\n",
    "    # 地铁线路名称\n",
    "    for i in range(lineNum) : \n",
    "        line_name = ''\n",
    "        line_name = line_name.join(all_a[i].string)\n",
    "        line_names.append(line_name)\n",
    "    print('地铁线路包括：')    \n",
    "    print(line_names)    \n",
    "\n",
    "    for line in range(lineNum):\n",
    "        # 获取第 line 条地铁线路链接\n",
    "        href2 = all_a[line]['href'] #取出 a 标签的 href 属性\n",
    "        line_url = all_url + href2 # https://dt.8684.cn/bj_x_6c955cb5\n",
    "        # print(line_url)\n",
    "        r2 = requests.get(line_url) # ,headers=headers\n",
    "        text2 = r2.text.encode(r2.encoding).decode('utf8')\n",
    "        Soup2 = BeautifulSoup(text2, 'lxml') \n",
    "        ## 获取地铁站点链接\n",
    "        ## all_a2 = Soup2.find('div',class_='routeMap').find_all('a')\n",
    "\n",
    "        # 获取线路名称 NavigableString 'div, rt-left'\n",
    "    #     line_span = Soup2.find('div',class_='rt-left').find_all('span')\n",
    "    #     line_name = ''\n",
    "    #     line_name = line_name.join(line_span[0].string)\n",
    "    #     line_names.append(line_name)\n",
    "        line_name = line_names[line]\n",
    "\n",
    "        # 获取该条线路经过的地铁站点 NavigableString\n",
    "        # stations_a = Soup2.find('div',class_='routeMap').find_all('a')\n",
    "        stations_a = Soup2.find_all('a',class_='cl-station')\n",
    "        station_names = []\n",
    "        for sta_a in stations_a :\n",
    "            station_name = ''\n",
    "            station_name = station_name.join(sta_a.string)\n",
    "            station_names.append(station_name)\n",
    "        # print(line_name,station_names)\n",
    "\n",
    "        # 为相邻站点建立连接\n",
    "        for i in range(len(station_names)-1):\n",
    "            # 忽略未开通的站\n",
    "            if '未开通' in station_names[i]: continue\n",
    "            if '未开通' in station_names[i+1]: continue\n",
    "            # 前站\n",
    "            near_list = station_connections.get(station_names[i])\n",
    "            near_station = (station_names[i+1],line_name)\n",
    "            if near_list == None :\n",
    "                station_connections[station_names[i]] = {near_station}\n",
    "            else:\n",
    "                near_list.add(near_station)\n",
    "                station_connections[station_names[i]] = near_list\n",
    "            # 后站\n",
    "            near_list = station_connections.get(station_names[i+1])\n",
    "            near_station = (station_names[i],line_name)\n",
    "            if near_list == None :\n",
    "                station_connections[station_names[i+1]] = {near_station}\n",
    "            else:\n",
    "                near_list.add(near_station)\n",
    "                station_connections[station_names[i+1]] = near_list\n",
    "        pass\n",
    "    print('地铁站点连接关系：')    \n",
    "    print(station_connections)\n",
    "    return station_connections"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "地铁线路包括：\n",
      "['1号线', '2号线外环', '2号线内环', '4号线大兴线', '5号线', '6号线', '7号线', '8号线南', '8号线北', '9号线', '10号线内环', '10号线外环', '13号线', '14号线东段', '14号线（西段）', '15号线', '16号线', 'S1号线', 'S2号线', '八通线', '昌平线', '大兴机场线', '房山线', '首都机场线', '西郊线', '燕房线', '亦庄线', '3号线', '11号线', '12号线']\n",
      "地铁站点连接关系：\n",
      "{'苹果园': {('古城', '1号线')}, '古城': {('苹果园', '1号线'), ('八角游乐园', '1号线')}, '八角游乐园': {('古城', '1号线'), ('八宝山', '1号线')}, '八宝山': {('玉泉路', '1号线'), ('八角游乐园', '1号线')}, '玉泉路': {('八宝山', '1号线'), ('五棵松', '1号线')}, '五棵松': {('万寿路', '1号线'), ('玉泉路', '1号线')}, '万寿路': {('公主坟', '1号线'), ('五棵松', '1号线')}, '公主坟': {('军事博物馆', '1号线'), ('西钓鱼台', '10号线外环'), ('西钓鱼台', '10号线内环'), ('莲花桥', '10号线内环'), ('莲花桥', '10号线外环'), ('万寿路', '1号线')}, '军事博物馆': {('北京西站', '9号线'), ('木樨地', '1号线'), ('公主坟', '1号线'), ('白堆子', '9号线')}, '木樨地': {('南礼士路', '1号线'), ('军事博物馆', '1号线')}, '南礼士路': {('木樨地', '1号线'), ('复兴门', '1号线')}, '复兴门': {('西单', '1号线'), ('阜成门', '2号线外环'), ('长椿街', '2号线内环'), ('长椿街', '2号线外环'), ('阜成门', '2号线内环'), ('南礼士路', '1号线')}, '西单': {('宣武门', '4号线大兴线'), ('天安门西', '1号线'), ('复兴门', '1号线'), ('灵境胡同', '4号线大兴线')}, '天安门西': {('天安门东', '1号线'), ('西单', '1号线')}, '天安门东': {('天安门西', '1号线'), ('王府井', '1号线')}, '王府井': {('东单', '1号线'), ('天安门东', '1号线')}, '东单': {('建国门', '1号线'), ('王府井', '1号线'), ('崇文门', '5号线'), ('灯市口', '5号线')}, '建国门': {('永安里', '1号线'), ('北京站', '2号线内环'), ('东单', '1号线'), ('朝阳门', '2号线内环'), ('朝阳门', '2号线外环'), ('北京站', '2号线外环')}, '永安里': {('建国门', '1号线'), ('国贸', '1号线')}, '国贸': {('双井', '10号线内环'), ('永安里', '1号线'), ('金台夕照', '10号线内环'), ('金台夕照', '10号线外环'), ('大望路', '1号线'), ('双井', '10号线外环')}, '大望路': {('四惠', '1号线'), ('国贸', '1号线'), ('九龙山', '14号线东段'), ('金台路', '14号线东段')}, '四惠': {('四惠东', '1号线'), ('大望路', '1号线'), ('四惠东', '八通线')}, '四惠东': {('四惠', '1号线'), ('四惠', '八通线'), ('高碑店', '八通线')}, '西直门': {('大钟寺', '13号线'), ('车公庄', '2号线外环'), ('动物园', '4号线大兴线'), ('车公庄', '2号线内环'), ('新街口', '4号线大兴线')}, '车公庄': {('平安里', '6号线'), ('车公庄西', '6号线'), ('阜成门', '2号线外环'), ('西直门', '2号线内环'), ('西直门', '2号线外环'), ('阜成门', '2号线内环')}, '阜成门': {('复兴门', '2号线内环'), ('车公庄', '2号线外环'), ('西四', '3号线'), ('车公庄', '2号线内环'), ('复兴门', '2号线外环')}, '长椿街': {('复兴门', '2号线外环'), ('复兴门', '2号线内环'), ('宣武门', '2号线外环'), ('宣武门', '2号线内环')}, '宣武门': {('和平门', '2号线内环'), ('长椿街', '2号线内环'), ('和平门', '2号线外环'), ('长椿街', '2号线外环'), ('西单', '4号线大兴线'), ('菜市口', '4号线大兴线')}, '和平门': {('宣武门', '2号线内环'), ('宣武门', '2号线外环'), ('前门', '2号线内环'), ('前门', '2号线外环')}, '前门': {('和平门', '2号线内环'), ('崇文门', '2号线外环'), ('崇文门', '2号线内环'), ('和平门', '2号线外环')}, '崇文门': {('北京站', '2号线内环'), ('前门', '2号线外环'), ('前门', '2号线内环'), ('北京站', '2号线外环'), ('磁器口', '5号线'), ('东单', '5号线')}, '北京站': {('建国门', '2号线外环'), ('崇文门', '2号线外环'), ('崇文门', '2号线内环'), ('建国门', '2号线内环')}, '朝阳门': {('建国门', '2号线内环'), ('东大桥', '6号线'), ('东四', '6号线'), ('东四十条', '2号线内环'), ('东四十条', '2号线外环'), ('建国门', '2号线外环')}, '东四十条': {('东直门', '2号线外环'), ('朝阳门', '2号线内环'), ('朝阳门', '2号线外环'), ('东四', '3号线'), ('东直门', '2号线内环')}, '东直门': {('东四十条', '2号线内环'), ('东四十条', '2号线外环'), ('三元桥', '首都机场线'), ('柳芳', '13号线'), ('雍和宫', '2号线内环'), ('雍和宫', '2号线外环')}, '雍和宫': {('东直门', '2号线外环'), ('和平里北街', '5号线'), ('安定门', '2号线外环'), ('安定门', '2号线内环'), ('北新桥', '5号线'), ('东直门', '2号线内环')}, '安定门': {('鼓楼大街', '2号线内环'), ('鼓楼大街', '2号线外环'), ('雍和宫', '2号线内环'), ('雍和宫', '2号线外环')}, '鼓楼大街': {('积水潭', '2号线内环'), ('什刹海', '8号线北'), ('安定门', '2号线外环'), ('安定门', '2号线内环'), ('积水潭', '2号线外环'), ('安德里北街', '8号线北')}, '积水潭': {('鼓楼大街', '2号线内环'), ('鼓楼大街', '2号线外环')}, '安河桥北': {('北宫门', '4号线大兴线')}, '北宫门': {('安河桥北', '4号线大兴线'), ('西苑', '4号线大兴线')}, '西苑': {('圆明园', '4号线大兴线'), ('农大南路', '16号线'), ('北宫门', '4号线大兴线')}, '圆明园': {('西苑', '4号线大兴线'), ('北京大学东门', '4号线大兴线')}, '北京大学东门': {('圆明园', '4号线大兴线'), ('中关村', '4号线大兴线')}, '中关村': {('北京大学东门', '4号线大兴线'), ('海淀黄庄', '4号线大兴线')}, '海淀黄庄': {('中关村', '4号线大兴线'), ('人民大学', '4号线大兴线'), ('知春里', '10号线内环'), ('知春里', '10号线外环'), ('苏州街', '10号线外环'), ('苏州街', '10号线内环')}, '人民大学': {('海淀黄庄', '4号线大兴线'), ('魏公村', '4号线大兴线')}, '魏公村': {('国家图书馆', '4号线大兴线'), ('人民大学', '4号线大兴线')}, '国家图书馆': {('动物园', '4号线大兴线'), ('魏公村', '4号线大兴线'), ('白石桥南', '9号线')}, '动物园': {('西直门', '4号线大兴线'), ('国家图书馆', '4号线大兴线')}, '新街口': {('西直门', '4号线大兴线'), ('平安里', '4号线大兴线')}, '平安里': {('西四', '4号线大兴线'), ('车公庄', '6号线'), ('新街口', '4号线大兴线'), ('北海北', '6号线')}, '西四': {('灵境胡同', '4号线大兴线'), ('平安里', '4号线大兴线'), ('阜成门', '3号线')}, '灵境胡同': {('西四', '4号线大兴线'), ('西单', '4号线大兴线')}, '菜市口': {('广安门内', '7号线'), ('宣武门', '4号线大兴线'), ('虎坊桥', '7号线'), ('陶然亭', '4号线大兴线')}, '陶然亭': {('北京南站', '4号线大兴线'), ('六里桥', '11号线'), ('菜市口', '4号线大兴线')}, '北京南站': {('马家堡', '4号线大兴线'), ('永定门外', '14号线东段'), ('陶然亭', '4号线大兴线')}, '马家堡': {('角门西', '4号线大兴线'), ('北京南站', '4号线大兴线')}, '角门西': {('角门东', '10号线内环'), ('角门东', '10号线外环'), ('草桥', '10号线外环'), ('草桥', '10号线内环'), ('公益西桥', '4号线大兴线'), ('马家堡', '4号线大兴线')}, '公益西桥': {('角门西', '4号线大兴线'), ('新宫', '4号线大兴线')}, '新宫': {('西红门', '4号线大兴线'), ('公益西桥', '4号线大兴线')}, '西红门': {('高米店北', '4号线大兴线'), ('新宫', '4号线大兴线')}, '高米店北': {('西红门', '4号线大兴线'), ('高米店南', '4号线大兴线')}, '高米店南': {('高米店北', '4号线大兴线'), ('枣园', '4号线大兴线')}, '枣园': {('清源路', '4号线大兴线'), ('高米店南', '4号线大兴线')}, '清源路': {('枣园', '4号线大兴线'), ('黄村西大街', '4号线大兴线')}, '黄村西大街': {('清源路', '4号线大兴线'), ('黄村火车站', '4号线大兴线')}, '黄村火车站': {('义和庄', '4号线大兴线'), ('黄村西大街', '4号线大兴线')}, '义和庄': {('生物医药基地', '4号线大兴线'), ('黄村火车站', '4号线大兴线')}, '生物医药基地': {('义和庄', '4号线大兴线'), ('天宫院', '4号线大兴线')}, '天宫院': {('生物医药基地', '4号线大兴线')}, '宋家庄': {('肖村', '亦庄线'), ('石榴庄', '10号线外环'), ('石榴庄', '10号线内环'), ('成寿寺', '10号线外环'), ('成寿寺', '10号线内环'), ('刘家窑', '5号线')}, '刘家窑': {('蒲黄榆', '5号线'), ('宋家庄', '5号线')}, '蒲黄榆': {('天坛东门', '5号线'), ('方庄', '14号线东段'), ('刘家窑', '5号线'), ('景泰', '14号线东段')}, '天坛东门': {('蒲黄榆', '5号线'), ('劲松', '11号线'), ('磁器口', '5号线')}, '磁器口': {('桥湾', '7号线'), ('广渠门内', '7号线'), ('天坛东门', '5号线'), ('崇文门', '5号线')}, '灯市口': {('东四', '5号线'), ('东单', '5号线')}, '东四': {('东四十条', '3号线'), ('灯市口', '5号线'), ('中国美术馆', '3号线'), ('张自忠路', '5号线'), ('朝阳门', '6号线'), ('南锣鼓巷', '6号线')}, '张自忠路': {('东四', '5号线'), ('北新桥', '5号线')}, '北新桥': {('雍和宫', '5号线'), ('张自忠路', '5号线')}, '和平里北街': {('雍和宫', '5号线'), ('和平西桥', '5号线')}, '和平西桥': {('光熙门', '12号线'), ('和平里北街', '5号线'), ('惠新西街南口', '5号线')}, '惠新西街南口': {('惠新西街北口', '5号线'), ('芍药居', '10号线外环'), ('芍药居', '10号线内环'), ('和平西桥', '5号线'), ('安贞门', '10号线内环'), ('安贞门', '10号线外环')}, '惠新西街北口': {('大屯路东', '5号线'), ('惠新西街南口', '5号线')}, '大屯路东': {('北苑路北', '5号线'), ('惠新西街北口', '5号线'), ('安立路', '15号线'), ('关庄', '15号线')}, '北苑路北': {('立水桥南', '5号线'), ('大屯路东', '5号线')}, '立水桥南': {('北苑路北', '5号线'), ('立水桥', '5号线')}, '立水桥': {('北苑', '13号线'), ('立水桥南', '5号线'), ('霍营', '13号线'), ('天通苑南', '5号线')}, '天通苑南': {('天通苑', '5号线'), ('立水桥', '5号线')}, '天通苑': {('天通苑北', '5号线'), ('天通苑南', '5号线')}, '天通苑北': {('天通苑', '5号线')}, '金安桥': {('四道桥', 'S1号线'), ('杨庄', '6号线')}, '杨庄': {('西黄村', '6号线'), ('金安桥', '6号线')}, '西黄村': {('廖公庄', '6号线'), ('杨庄', '6号线')}, '廖公庄': {('西黄村', '6号线'), ('田村', '6号线')}, '田村': {('廖公庄', '6号线'), ('海淀五路居', '6号线')}, '海淀五路居': {('慈寿寺', '6号线'), ('田村', '6号线')}, '慈寿寺': {('海淀五路居', '6号线'), ('西钓鱼台', '10号线内环'), ('西钓鱼台', '10号线外环'), ('车道沟', '10号线内环'), ('车道沟', '10号线外环'), ('花园桥', '6号线')}, '花园桥': {('慈寿寺', '6号线'), ('白石桥南', '6号线')}, '白石桥南': {('国家图书馆', '9号线'), ('花园桥', '6号线'), ('车公庄西', '6号线'), ('白堆子', '9号线')}, '车公庄西': {('车公庄', '6号线'), ('白石桥南', '6号线')}, '北海北': {('平安里', '6号线'), ('南锣鼓巷', '6号线')}, '南锣鼓巷': {('东四', '6号线'), ('中国美术馆', '8号线北'), ('北海北', '6号线'), ('什刹海', '8号线北')}, '东大桥': {('呼家楼', '6号线'), ('朝阳门', '6号线')}, '呼家楼': {('东大桥', '6号线'), ('金台夕照', '10号线内环'), ('金台夕照', '10号线外环'), ('金台路', '6号线'), ('团结湖', '10号线内环'), ('团结湖', '10号线外环')}, '金台路': {('呼家楼', '6号线'), ('十里堡', '6号线'), ('朝阳公园', '14号线东段'), ('大望路', '14号线东段')}, '十里堡': {('金台路', '6号线'), ('青年路', '6号线')}, '青年路': {('十里堡', '6号线'), ('褡裢坡', '6号线')}, '褡裢坡': {('黄渠', '6号线'), ('青年路', '6号线')}, '黄渠': {('褡裢坡', '6号线'), ('常营', '6号线')}, '常营': {('草房', '6号线'), ('黄渠', '6号线')}, '草房': {('物资学院路', '6号线'), ('常营', '6号线')}, '物资学院路': {('草房', '6号线'), ('通州北关', '6号线')}, '通州北关': {('北运河西', '6号线'), ('物资学院路', '6号线')}, '北运河西': {('北运河东', '6号线'), ('通州北关', '6号线')}, '北运河东': {('北运河西', '6号线'), ('郝家府', '6号线')}, '郝家府': {('北运河东', '6号线'), ('东夏园', '6号线')}, '东夏园': {('潞城', '6号线'), ('郝家府', '6号线')}, '潞城': {('东夏园', '6号线')}, '北京西站': {('军事博物馆', '9号线'), ('六里桥东', '9号线'), ('湾子', '7号线')}, '湾子': {('达官营', '7号线'), ('北京西站', '7号线')}, '达官营': {('广安门内', '7号线'), ('湾子', '7号线')}, '广安门内': {('菜市口', '7号线'), ('达官营', '7号线')}, '虎坊桥': {('珠市口', '7号线'), ('菜市口', '7号线')}, '珠市口': {('虎坊桥', '7号线'), ('桥湾', '7号线'), ('天桥', '8号线南')}, '桥湾': {('磁器口', '7号线'), ('珠市口', '7号线')}, '广渠门内': {('磁器口', '7号线'), ('广渠门外', '7号线')}, '广渠门外': {('广渠门内', '7号线'), ('双井', '7号线')}, '双井': {('国贸', '10号线内环'), ('国贸', '10号线外环'), ('劲松', '10号线内环'), ('劲松', '10号线外环'), ('九龙山', '7号线'), ('广渠门外', '7号线')}, '九龙山': {('双井', '7号线'), ('大望路', '14号线东段'), ('北工大西门', '14号线东段'), ('大郊亭', '7号线')}, '大郊亭': {('百子湾', '7号线'), ('九龙山', '7号线')}, '百子湾': {('化工', '7号线'), ('大郊亭', '7号线')}, '化工': {('百子湾', '7号线'), ('南楼梓庄', '7号线')}, '南楼梓庄': {('欢乐谷景区', '7号线'), ('化工', '7号线')}, '欢乐谷景区': {('南楼梓庄', '7号线'), ('垡头', '7号线')}, '垡头': {('双合', '7号线'), ('欢乐谷景区', '7号线')}, '双合': {('焦化厂', '7号线'), ('垡头', '7号线')}, '焦化厂': {('黄厂', '7号线'), ('双合', '7号线')}, '黄厂': {('焦化厂', '7号线'), ('郎辛庄', '7号线')}, '郎辛庄': {('黄厂', '7号线'), ('黑庄户', '7号线')}, '黑庄户': {('万盛西', '7号线'), ('郎辛庄', '7号线')}, '万盛西': {('万盛东', '7号线'), ('黑庄户', '7号线')}, '万盛东': {('万盛西', '7号线'), ('群芳', '7号线')}, '群芳': {('高楼金', '7号线'), ('万盛东', '7号线')}, '高楼金': {('群芳', '7号线'), ('花庄', '7号线')}, '花庄': {('高楼金', '7号线'), ('土桥', '八通线')}, '瀛海': {('德茂', '8号线南')}, '德茂': {('五福堂', '8号线南'), ('瀛海', '8号线南')}, '五福堂': {('火箭万源', '8号线南'), ('德茂', '8号线南')}, '火箭万源': {('五福堂', '8号线南'), ('东高地', '8号线南')}, '东高地': {('和义', '8号线南'), ('火箭万源', '8号线南')}, '和义': {('大红门南', '8号线南'), ('东高地', '8号线南')}, '大红门南': {('海户屯', '8号线南'), ('和义', '8号线南')}, '海户屯': {('木樨园', '8号线南'), ('大红门南', '8号线南')}, '木樨园': {('海户屯', '8号线南'), ('永定门外', '8号线南')}, '永定门外': {('景泰', '14号线东段'), ('北京南站', '14号线东段'), ('天桥', '8号线南'), ('木樨园', '8号线南')}, '天桥': {('珠市口', '8号线南'), ('永定门外', '8号线南')}, '朱辛庄': {('巩华城', '昌平线'), ('生命科学园', '昌平线'), ('育知路', '8号线北')}, '育知路': {('平西府', '8号线北'), ('朱辛庄', '8号线北')}, '平西府': {('回龙观东大街', '8号线北'), ('育知路', '8号线北')}, '回龙观东大街': {('平西府', '8号线北'), ('霍营', '8号线北')}, '霍营': {('回龙观', '13号线'), ('回龙观东大街', '8号线北'), ('育新', '8号线北'), ('立水桥', '13号线')}, '育新': {('西小口', '8号线北'), ('霍营', '8号线北')}, '西小口': {('永泰庄', '8号线北'), ('育新', '8号线北')}, '永泰庄': {('西小口', '8号线北'), ('林萃桥', '8号线北')}, '林萃桥': {('永泰庄', '8号线北'), ('森林公园南门', '8号线北')}, '森林公园南门': {('奥林匹克公园', '8号线北'), ('林萃桥', '8号线北')}, '奥林匹克公园': {('北沙滩', '15号线'), ('安立路', '15号线'), ('奥体中心', '8号线北'), ('森林公园南门', '8号线北')}, '奥体中心': {('北土城', '8号线北'), ('奥林匹克公园', '8号线北')}, '北土城': {('奥体中心', '8号线北'), ('安华桥', '8号线北'), ('健德门', '10号线内环'), ('健德门', '10号线外环'), ('安贞门', '10号线内环'), ('安贞门', '10号线外环')}, '安华桥': {('安德里北街', '8号线北'), ('北土城', '8号线北')}, '安德里北街': {('安华桥', '8号线北'), ('鼓楼大街', '8号线北')}, '什刹海': {('南锣鼓巷', '8号线北'), ('鼓楼大街', '8号线北')}, '中国美术馆': {('东四', '3号线'), ('南锣鼓巷', '8号线北')}, '郭公庄': {('丰台科技园', '9号线'), ('大葆台', '房山线')}, '丰台科技园': {('科怡路', '9号线'), ('郭公庄', '9号线')}, '科怡路': {('丰台科技园', '9号线'), ('丰台南路', '9号线')}, '丰台南路': {('丰台东大街', '9号线'), ('科怡路', '9号线')}, '丰台东大街': {('七里庄', '9号线'), ('丰台南路', '9号线')}, '七里庄': {('丰台东大街', '9号线'), ('西局', '14号线（西段）'), ('大井', '14号线（西段）'), ('六里桥', '9号线')}, '六里桥': {('六里桥东', '9号线'), ('陶然亭', '11号线'), ('七里庄', '9号线'), ('莲花桥', '10号线外环'), ('莲花桥', '10号线内环'), ('西局', '10号线内环'), ('西局', '10号线外环')}, '六里桥东': {('北京西站', '9号线'), ('六里桥', '9号线')}, '白堆子': {('军事博物馆', '9号线'), ('白石桥南', '9号线')}, '巴沟': {('火器营', '10号线外环'), ('颐和园西门', '西郊线'), ('苏州街', '10号线内环')}, '苏州街': {('巴沟', '10号线内环'), ('海淀黄庄', '10号线外环'), ('海淀黄庄', '10号线内环')}, '知春里': {('海淀黄庄', '10号线外环'), ('知春路', '10号线外环'), ('海淀黄庄', '10号线内环'), ('知春路', '10号线内环')}, '知春路': {('大钟寺', '13号线'), ('西土城', '10号线外环'), ('五道口', '13号线'), ('知春里', '10号线内环'), ('知春里', '10号线外环'), ('西土城', '10号线内环')}, '西土城': {('知春路', '10号线外环'), ('牡丹园', '10号线内环'), ('牡丹园', '10号线外环'), ('知春路', '10号线内环')}, '牡丹园': {('西土城', '10号线内环'), ('健德门', '10号线内环'), ('健德门', '10号线外环'), ('西土城', '10号线外环')}, '健德门': {('牡丹园', '10号线内环'), ('牡丹园', '10号线外环'), ('北土城', '10号线内环'), ('北土城', '10号线外环')}, '安贞门': {('惠新西街南口', '10号线内环'), ('惠新西街南口', '10号线外环'), ('北土城', '10号线内环'), ('北土城', '10号线外环')}, '芍药居': {('太阳宫', '10号线内环'), ('太阳宫', '10号线外环'), ('惠新西街南口', '10号线内环'), ('光熙门', '13号线'), ('惠新西街南口', '10号线外环'), ('望京西', '13号线')}, '太阳宫': {('三元桥', '10号线外环'), ('芍药居', '10号线外环'), ('芍药居', '10号线内环'), ('三元桥', '10号线内环')}, '三元桥': {('T3航站楼', '首都机场线'), ('亮马桥', '10号线外环'), ('亮马桥', '10号线内环'), ('太阳宫', '10号线内环'), ('东直门', '首都机场线'), ('太阳宫', '10号线外环')}, '亮马桥': {('农业展览馆', '10号线外环'), ('三元桥', '10号线外环'), ('农业展览馆', '10号线内环'), ('三元桥', '10号线内环')}, '农业展览馆': {('团结湖', '10号线内环'), ('团结湖', '10号线外环'), ('亮马桥', '10号线外环'), ('亮马桥', '10号线内环')}, '团结湖': {('农业展览馆', '10号线外环'), ('农业展览馆', '10号线内环'), ('呼家楼', '10号线外环'), ('朝阳公园', '3号线'), ('呼家楼', '10号线内环')}, '金台夕照': {('国贸', '10号线外环'), ('国贸', '10号线内环'), ('呼家楼', '10号线内环'), ('呼家楼', '10号线外环')}, '劲松': {('潘家园', '10号线外环'), ('双井', '10号线外环'), ('双井', '10号线内环'), ('天坛东门', '11号线'), ('平乐园', '11号线'), ('潘家园', '10号线内环')}, '潘家园': {('十里河', '10号线内环'), ('十里河', '10号线外环'), ('劲松', '10号线外环'), ('劲松', '10号线内环')}, '十里河': {('潘家园', '10号线外环'), ('方庄', '14号线东段'), ('分钟寺', '10号线外环'), ('分钟寺', '10号线内环'), ('潘家园', '10号线内环'), ('北工大西门', '14号线东段')}, '分钟寺': {('十里河', '10号线内环'), ('十里河', '10号线外环'), ('成寿寺', '10号线内环'), ('成寿寺', '10号线外环')}, '成寿寺': {('宋家庄', '10号线内环'), ('宋家庄', '10号线外环'), ('分钟寺', '10号线外环'), ('分钟寺', '10号线内环')}, '石榴庄': {('大红门', '10号线内环'), ('宋家庄', '10号线内环'), ('宋家庄', '10号线外环'), ('大红门', '10号线外环')}, '大红门': {('角门东', '10号线外环'), ('角门东', '10号线内环'), ('石榴庄', '10号线外环'), ('石榴庄', '10号线内环')}, '角门东': {('大红门', '10号线内环'), ('角门西', '10号线外环'), ('大红门', '10号线外环'), ('角门西', '10号线内环')}, '草桥': {('纪家庙', '10号线内环'), ('纪家庙', '10号线外环'), ('角门西', '10号线内环'), ('大兴新城', '大兴机场线'), ('角门西', '10号线外环')}, '纪家庙': {('首经贸', '10号线内环'), ('首经贸', '10号线外环'), ('草桥', '10号线内环'), ('草桥', '10号线外环')}, '首经贸': {('纪家庙', '10号线内环'), ('纪家庙', '10号线外环'), ('丰台', '10号线外环'), ('丰台', '10号线内环')}, '丰台': {('首经贸', '10号线外环'), ('泥洼', '10号线外环'), ('泥洼', '10号线内环'), ('首经贸', '10号线内环')}, '泥洼': {('西局', '10号线外环'), ('西局', '10号线内环'), ('丰台', '10号线外环'), ('丰台', '10号线内环')}, '西局': {('泥洼', '10号线内环'), ('泥洼', '10号线外环'), ('六里桥', '10号线内环'), ('六里桥', '10号线外环'), ('七里庄', '14号线（西段）')}, '莲花桥': {('六里桥', '10号线内环'), ('公主坟', '10号线外环'), ('六里桥', '10号线外环'), ('公主坟', '10号线内环')}, '西钓鱼台': {('慈寿寺', '10号线内环'), ('公主坟', '10号线外环'), ('慈寿寺', '10号线外环'), ('公主坟', '10号线内环')}, '车道沟': {('长春桥', '10号线内环'), ('慈寿寺', '10号线外环'), ('长春桥', '10号线外环'), ('慈寿寺', '10号线内环')}, '长春桥': {('火器营', '10号线内环'), ('车道沟', '10号线内环'), ('火器营', '10号线外环'), ('车道沟', '10号线外环')}, '火器营': {('长春桥', '10号线内环'), ('巴沟', '10号线外环'), ('长春桥', '10号线外环')}, '大钟寺': {('知春路', '13号线'), ('西直门', '13号线')}, '五道口': {('知春路', '13号线'), ('上地', '13号线')}, '上地': {('五道口', '13号线'), ('清河', '13号线')}, '清河': {('西二旗', '13号线'), ('上地', '13号线')}, '西二旗': {('龙泽', '13号线'), ('生命科学园', '昌平线'), ('清河', '13号线')}, '龙泽': {('回龙观', '13号线'), ('西二旗', '13号线')}, '回龙观': {('龙泽', '13号线'), ('霍营', '13号线')}, '北苑': {('望京西', '13号线'), ('立水桥', '13号线')}, '望京西': {('芍药居', '13号线'), ('北苑', '13号线'), ('望京', '15号线'), ('关庄', '15号线')}, '光熙门': {('芍药居', '13号线'), ('和平西桥', '12号线'), ('柳芳', '13号线')}, '柳芳': {('东直门', '13号线'), ('光熙门', '13号线')}, '景泰': {('永定门外', '14号线东段'), ('蒲黄榆', '14号线东段')}, '方庄': {('十里河', '14号线东段'), ('蒲黄榆', '14号线东段')}, '北工大西门': {('十里河', '14号线东段'), ('九龙山', '14号线东段')}, '朝阳公园': {('金台路', '14号线东段'), ('团结湖', '3号线'), ('枣营', '14号线东段')}, '枣营': {('朝阳公园', '14号线东段'), ('东风北桥', '14号线东段')}, '东风北桥': {('将台', '14号线东段'), ('枣营', '14号线东段')}, '将台': {('望京南', '14号线东段'), ('东风北桥', '14号线东段')}, '望京南': {('将台', '14号线东段'), ('阜通', '14号线东段')}, '阜通': {('望京南', '14号线东段'), ('望京', '14号线东段')}, '望京': {('东湖渠', '14号线东段'), ('望京西', '15号线'), ('阜通', '14号线东段'), ('望京东', '15号线')}, '东湖渠': {('望京', '14号线东段'), ('来广营', '14号线东段')}, '来广营': {('东湖渠', '14号线东段'), ('善各庄', '14号线东段')}, '善各庄': {('来广营', '14号线东段')}, '张郭庄': {('园博园', '14号线（西段）')}, '园博园': {('张郭庄', '14号线（西段）'), ('大瓦窑', '14号线（西段）')}, '大瓦窑': {('郭庄子', '14号线（西段）'), ('园博园', '14号线（西段）')}, '郭庄子': {('大井', '14号线（西段）'), ('大瓦窑', '14号线（西段）')}, '大井': {('七里庄', '14号线（西段）'), ('郭庄子', '14号线（西段）')}, '俸伯': {('顺义', '15号线')}, '顺义': {('石门', '15号线'), ('俸伯', '15号线')}, '石门': {('南法信', '15号线'), ('顺义', '15号线')}, '南法信': {('石门', '15号线'), ('后沙峪', '15号线')}, '后沙峪': {('南法信', '15号线'), ('花梨坎', '15号线')}, '花梨坎': {('后沙峪', '15号线'), ('国展', '15号线')}, '国展': {('孙河', '15号线'), ('花梨坎', '15号线')}, '孙河': {('马泉营', '15号线'), ('国展', '15号线')}, '马泉营': {('孙河', '15号线'), ('崔各庄', '15号线')}, '崔各庄': {('马泉营', '15号线'), ('望京东', '15号线')}, '望京东': {('望京', '15号线'), ('崔各庄', '15号线')}, '关庄': {('望京西', '15号线'), ('大屯路东', '15号线')}, '安立路': {('奥林匹克公园', '15号线'), ('大屯路东', '15号线')}, '北沙滩': {('奥林匹克公园', '15号线'), ('六道口', '15号线')}, '六道口': {('清华东路西口', '15号线'), ('北沙滩', '15号线')}, '清华东路西口': {('六道口', '15号线')}, '农大南路': {('西苑', '16号线'), ('马连洼', '16号线')}, '马连洼': {('西北旺', '16号线'), ('农大南路', '16号线')}, '西北旺': {('永丰南', '16号线'), ('马连洼', '16号线')}, '永丰南': {('西北旺', '16号线'), ('永丰', '16号线')}, '永丰': {('永丰南', '16号线'), ('屯佃', '16号线')}, '屯佃': {('稻香湖路', '16号线'), ('永丰', '16号线')}, '稻香湖路': {('温阳路', '16号线'), ('屯佃', '16号线')}, '温阳路': {('稻香湖路', '16号线'), ('北安河', '16号线')}, '北安河': {('温阳路', '16号线')}, '四道桥': {('金安桥', 'S1号线'), ('桥户营', 'S1号线')}, '桥户营': {('四道桥', 'S1号线'), ('上岸', 'S1号线')}, '上岸': {('栗园庄', 'S1号线'), ('桥户营', 'S1号线')}, '栗园庄': {('上岸', 'S1号线'), ('小园', 'S1号线')}, '小园': {('石厂', 'S1号线'), ('栗园庄', 'S1号线')}, '石厂': {('小园', 'S1号线')}, '延庆': {('八达岭', 'S2号线')}, '八达岭': {('延庆', 'S2号线'), ('南口', 'S2号线')}, '南口': {('黄土店', 'S2号线'), ('八达岭', 'S2号线')}, '黄土店': {('南口', 'S2号线')}, '高碑店': {('传媒大学', '八通线'), ('四惠东', '八通线')}, '传媒大学': {('双桥', '八通线'), ('高碑店', '八通线')}, '双桥': {('传媒大学', '八通线'), ('管庄', '八通线')}, '管庄': {('八里桥', '八通线'), ('双桥', '八通线')}, '八里桥': {('管庄', '八通线'), ('通州北苑', '八通线')}, '通州北苑': {('果园', '八通线'), ('八里桥', '八通线')}, '果园': {('九棵树', '八通线'), ('通州北苑', '八通线')}, '九棵树': {('梨园', '八通线'), ('果园', '八通线')}, '梨园': {('九棵树', '八通线'), ('临河里', '八通线')}, '临河里': {('梨园', '八通线'), ('土桥', '八通线')}, '土桥': {('花庄', '八通线'), ('临河里', '八通线')}, '昌平西山口': {('十三陵景区', '昌平线')}, '十三陵景区': {('昌平', '昌平线'), ('昌平西山口', '昌平线')}, '昌平': {('昌平东关', '昌平线'), ('十三陵景区', '昌平线')}, '昌平东关': {('北邵洼', '昌平线'), ('昌平', '昌平线')}, '北邵洼': {('南邵', '昌平线'), ('昌平东关', '昌平线')}, '南邵': {('北邵洼', '昌平线'), ('沙河高教园', '昌平线')}, '沙河高教园': {('南邵', '昌平线'), ('沙河', '昌平线')}, '沙河': {('巩华城', '昌平线'), ('沙河高教园', '昌平线')}, '巩华城': {('朱辛庄', '昌平线'), ('沙河', '昌平线')}, '生命科学园': {('西二旗', '昌平线'), ('朱辛庄', '昌平线')}, '大兴新城': {('草桥', '大兴机场线'), ('大兴机场', '大兴机场线')}, '大兴机场': {('大兴新城', '大兴机场线')}, '阎村东': {('苏庄', '房山线'), ('紫草坞', '燕房线')}, '苏庄': {('良乡南关', '房山线'), ('阎村东', '房山线')}, '良乡南关': {('苏庄', '房山线'), ('良乡大学城西', '房山线')}, '良乡大学城西': {('良乡南关', '房山线'), ('良乡大学城', '房山线')}, '良乡大学城': {('良乡大学城西', '房山线'), ('良乡大学城北', '房山线')}, '良乡大学城北': {('良乡大学城', '房山线'), ('广阳城', '房山线')}, '广阳城': {('篱笆房', '房山线'), ('良乡大学城北', '房山线')}, '篱笆房': {('长阳', '房山线'), ('广阳城', '房山线')}, '长阳': {('篱笆房', '房山线'), ('稻田', '房山线')}, '稻田': {('长阳', '房山线'), ('大葆台', '房山线')}, '大葆台': {('郭公庄', '房山线'), ('稻田', '房山线')}, 'T3航站楼': {('T2航站楼', '首都机场线'), ('三元桥', '首都机场线')}, 'T2航站楼': {('T3航站楼', '首都机场线')}, '香山': {('植物园', '西郊线')}, '植物园': {('万安', '西郊线'), ('香山', '西郊线')}, '万安': {('植物园', '西郊线'), ('茶棚', '西郊线')}, '茶棚': {('颐和园西门', '西郊线'), ('万安', '西郊线')}, '颐和园西门': {('巴沟', '西郊线'), ('茶棚', '西郊线')}, '紫草坞': {('阎村', '燕房线'), ('阎村东', '燕房线')}, '阎村': {('紫草坞', '燕房线'), ('星城', '燕房线')}, '星城': {('大石河东', '燕房线'), ('阎村', '燕房线')}, '大石河东': {('星城', '燕房线'), ('马各庄', '燕房线')}, '马各庄': {('大石河东', '燕房线'), ('饶乐府', '燕房线')}, '饶乐府': {('马各庄', '燕房线'), ('房山城关', '燕房线')}, '房山城关': {('燕山', '燕房线'), ('饶乐府', '燕房线')}, '燕山': {('房山城关', '燕房线')}, '肖村': {('小红门', '亦庄线'), ('宋家庄', '亦庄线')}, '小红门': {('肖村', '亦庄线'), ('旧宫', '亦庄线')}, '旧宫': {('小红门', '亦庄线'), ('亦庄桥', '亦庄线')}, '亦庄桥': {('亦庄文化园', '亦庄线'), ('旧宫', '亦庄线')}, '亦庄文化园': {('万源街', '亦庄线'), ('亦庄桥', '亦庄线')}, '万源街': {('荣京东街', '亦庄线'), ('亦庄文化园', '亦庄线')}, '荣京东街': {('万源街', '亦庄线'), ('荣昌东街', '亦庄线')}, '荣昌东街': {('荣京东街', '亦庄线'), ('同济南路', '亦庄线')}, '同济南路': {('经海路', '亦庄线'), ('荣昌东街', '亦庄线')}, '经海路': {('同济南路', '亦庄线'), ('次渠南', '亦庄线')}, '次渠南': {('经海路', '亦庄线'), ('次渠', '亦庄线')}, '次渠': {('亦庄火车站', '亦庄线'), ('次渠南', '亦庄线')}, '亦庄火车站': {('次渠', '亦庄线')}, '平乐园': {('劲松', '11号线')}}\n",
      "{'苹果园': {('古城', '1号线')}, '古城': {('苹果园', '1号线'), ('八角游乐园', '1号线')}, '八角游乐园': {('古城', '1号线'), ('八宝山', '1号线')}, '八宝山': {('玉泉路', '1号线'), ('八角游乐园', '1号线')}, '玉泉路': {('八宝山', '1号线'), ('五棵松', '1号线')}, '五棵松': {('万寿路', '1号线'), ('玉泉路', '1号线')}, '万寿路': {('公主坟', '1号线'), ('五棵松', '1号线')}, '公主坟': {('军事博物馆', '1号线'), ('西钓鱼台', '10号线外环'), ('西钓鱼台', '10号线内环'), ('莲花桥', '10号线内环'), ('莲花桥', '10号线外环'), ('万寿路', '1号线')}, '军事博物馆': {('北京西站', '9号线'), ('木樨地', '1号线'), ('公主坟', '1号线'), ('白堆子', '9号线')}, '木樨地': {('南礼士路', '1号线'), ('军事博物馆', '1号线')}, '南礼士路': {('木樨地', '1号线'), ('复兴门', '1号线')}, '复兴门': {('西单', '1号线'), ('阜成门', '2号线外环'), ('长椿街', '2号线内环'), ('长椿街', '2号线外环'), ('阜成门', '2号线内环'), ('南礼士路', '1号线')}, '西单': {('宣武门', '4号线大兴线'), ('天安门西', '1号线'), ('复兴门', '1号线'), ('灵境胡同', '4号线大兴线')}, '天安门西': {('天安门东', '1号线'), ('西单', '1号线')}, '天安门东': {('天安门西', '1号线'), ('王府井', '1号线')}, '王府井': {('东单', '1号线'), ('天安门东', '1号线')}, '东单': {('建国门', '1号线'), ('王府井', '1号线'), ('崇文门', '5号线'), ('灯市口', '5号线')}, '建国门': {('永安里', '1号线'), ('北京站', '2号线内环'), ('东单', '1号线'), ('朝阳门', '2号线内环'), ('朝阳门', '2号线外环'), ('北京站', '2号线外环')}, '永安里': {('建国门', '1号线'), ('国贸', '1号线')}, '国贸': {('双井', '10号线内环'), ('永安里', '1号线'), ('金台夕照', '10号线内环'), ('金台夕照', '10号线外环'), ('大望路', '1号线'), ('双井', '10号线外环')}, '大望路': {('四惠', '1号线'), ('国贸', '1号线'), ('九龙山', '14号线东段'), ('金台路', '14号线东段')}, '四惠': {('四惠东', '1号线'), ('大望路', '1号线'), ('四惠东', '八通线')}, '四惠东': {('四惠', '1号线'), ('四惠', '八通线'), ('高碑店', '八通线')}, '西直门': {('大钟寺', '13号线'), ('车公庄', '2号线外环'), ('动物园', '4号线大兴线'), ('车公庄', '2号线内环'), ('新街口', '4号线大兴线')}, '车公庄': {('平安里', '6号线'), ('车公庄西', '6号线'), ('阜成门', '2号线外环'), ('西直门', '2号线内环'), ('西直门', '2号线外环'), ('阜成门', '2号线内环')}, '阜成门': {('复兴门', '2号线内环'), ('车公庄', '2号线外环'), ('西四', '3号线'), ('车公庄', '2号线内环'), ('复兴门', '2号线外环')}, '长椿街': {('复兴门', '2号线外环'), ('复兴门', '2号线内环'), ('宣武门', '2号线外环'), ('宣武门', '2号线内环')}, '宣武门': {('和平门', '2号线内环'), ('长椿街', '2号线内环'), ('和平门', '2号线外环'), ('长椿街', '2号线外环'), ('西单', '4号线大兴线'), ('菜市口', '4号线大兴线')}, '和平门': {('宣武门', '2号线内环'), ('宣武门', '2号线外环'), ('前门', '2号线内环'), ('前门', '2号线外环')}, '前门': {('和平门', '2号线内环'), ('崇文门', '2号线外环'), ('崇文门', '2号线内环'), ('和平门', '2号线外环')}, '崇文门': {('北京站', '2号线内环'), ('前门', '2号线外环'), ('前门', '2号线内环'), ('北京站', '2号线外环'), ('磁器口', '5号线'), ('东单', '5号线')}, '北京站': {('建国门', '2号线外环'), ('崇文门', '2号线外环'), ('崇文门', '2号线内环'), ('建国门', '2号线内环')}, '朝阳门': {('建国门', '2号线内环'), ('东大桥', '6号线'), ('东四', '6号线'), ('东四十条', '2号线内环'), ('东四十条', '2号线外环'), ('建国门', '2号线外环')}, '东四十条': {('东直门', '2号线外环'), ('朝阳门', '2号线内环'), ('朝阳门', '2号线外环'), ('东四', '3号线'), ('东直门', '2号线内环')}, '东直门': {('东四十条', '2号线内环'), ('东四十条', '2号线外环'), ('三元桥', '首都机场线'), ('柳芳', '13号线'), ('雍和宫', '2号线内环'), ('雍和宫', '2号线外环')}, '雍和宫': {('东直门', '2号线外环'), ('和平里北街', '5号线'), ('安定门', '2号线外环'), ('安定门', '2号线内环'), ('北新桥', '5号线'), ('东直门', '2号线内环')}, '安定门': {('鼓楼大街', '2号线内环'), ('鼓楼大街', '2号线外环'), ('雍和宫', '2号线内环'), ('雍和宫', '2号线外环')}, '鼓楼大街': {('积水潭', '2号线内环'), ('什刹海', '8号线北'), ('安定门', '2号线外环'), ('安定门', '2号线内环'), ('积水潭', '2号线外环'), ('安德里北街', '8号线北')}, '积水潭': {('鼓楼大街', '2号线内环'), ('鼓楼大街', '2号线外环')}, '安河桥北': {('北宫门', '4号线大兴线')}, '北宫门': {('安河桥北', '4号线大兴线'), ('西苑', '4号线大兴线')}, '西苑': {('圆明园', '4号线大兴线'), ('农大南路', '16号线'), ('北宫门', '4号线大兴线')}, '圆明园': {('西苑', '4号线大兴线'), ('北京大学东门', '4号线大兴线')}, '北京大学东门': {('圆明园', '4号线大兴线'), ('中关村', '4号线大兴线')}, '中关村': {('北京大学东门', '4号线大兴线'), ('海淀黄庄', '4号线大兴线')}, '海淀黄庄': {('中关村', '4号线大兴线'), ('人民大学', '4号线大兴线'), ('知春里', '10号线内环'), ('知春里', '10号线外环'), ('苏州街', '10号线外环'), ('苏州街', '10号线内环')}, '人民大学': {('海淀黄庄', '4号线大兴线'), ('魏公村', '4号线大兴线')}, '魏公村': {('国家图书馆', '4号线大兴线'), ('人民大学', '4号线大兴线')}, '国家图书馆': {('动物园', '4号线大兴线'), ('魏公村', '4号线大兴线'), ('白石桥南', '9号线')}, '动物园': {('西直门', '4号线大兴线'), ('国家图书馆', '4号线大兴线')}, '新街口': {('西直门', '4号线大兴线'), ('平安里', '4号线大兴线')}, '平安里': {('西四', '4号线大兴线'), ('车公庄', '6号线'), ('新街口', '4号线大兴线'), ('北海北', '6号线')}, '西四': {('灵境胡同', '4号线大兴线'), ('平安里', '4号线大兴线'), ('阜成门', '3号线')}, '灵境胡同': {('西四', '4号线大兴线'), ('西单', '4号线大兴线')}, '菜市口': {('广安门内', '7号线'), ('宣武门', '4号线大兴线'), ('虎坊桥', '7号线'), ('陶然亭', '4号线大兴线')}, '陶然亭': {('北京南站', '4号线大兴线'), ('六里桥', '11号线'), ('菜市口', '4号线大兴线')}, '北京南站': {('马家堡', '4号线大兴线'), ('永定门外', '14号线东段'), ('陶然亭', '4号线大兴线')}, '马家堡': {('角门西', '4号线大兴线'), ('北京南站', '4号线大兴线')}, '角门西': {('角门东', '10号线内环'), ('角门东', '10号线外环'), ('草桥', '10号线外环'), ('草桥', '10号线内环'), ('公益西桥', '4号线大兴线'), ('马家堡', '4号线大兴线')}, '公益西桥': {('角门西', '4号线大兴线'), ('新宫', '4号线大兴线')}, '新宫': {('西红门', '4号线大兴线'), ('公益西桥', '4号线大兴线')}, '西红门': {('高米店北', '4号线大兴线'), ('新宫', '4号线大兴线')}, '高米店北': {('西红门', '4号线大兴线'), ('高米店南', '4号线大兴线')}, '高米店南': {('高米店北', '4号线大兴线'), ('枣园', '4号线大兴线')}, '枣园': {('清源路', '4号线大兴线'), ('高米店南', '4号线大兴线')}, '清源路': {('枣园', '4号线大兴线'), ('黄村西大街', '4号线大兴线')}, '黄村西大街': {('清源路', '4号线大兴线'), ('黄村火车站', '4号线大兴线')}, '黄村火车站': {('义和庄', '4号线大兴线'), ('黄村西大街', '4号线大兴线')}, '义和庄': {('生物医药基地', '4号线大兴线'), ('黄村火车站', '4号线大兴线')}, '生物医药基地': {('义和庄', '4号线大兴线'), ('天宫院', '4号线大兴线')}, '天宫院': {('生物医药基地', '4号线大兴线')}, '宋家庄': {('肖村', '亦庄线'), ('石榴庄', '10号线外环'), ('石榴庄', '10号线内环'), ('成寿寺', '10号线外环'), ('成寿寺', '10号线内环'), ('刘家窑', '5号线')}, '刘家窑': {('蒲黄榆', '5号线'), ('宋家庄', '5号线')}, '蒲黄榆': {('天坛东门', '5号线'), ('方庄', '14号线东段'), ('刘家窑', '5号线'), ('景泰', '14号线东段')}, '天坛东门': {('蒲黄榆', '5号线'), ('劲松', '11号线'), ('磁器口', '5号线')}, '磁器口': {('桥湾', '7号线'), ('广渠门内', '7号线'), ('天坛东门', '5号线'), ('崇文门', '5号线')}, '灯市口': {('东四', '5号线'), ('东单', '5号线')}, '东四': {('东四十条', '3号线'), ('灯市口', '5号线'), ('中国美术馆', '3号线'), ('张自忠路', '5号线'), ('朝阳门', '6号线'), ('南锣鼓巷', '6号线')}, '张自忠路': {('东四', '5号线'), ('北新桥', '5号线')}, '北新桥': {('雍和宫', '5号线'), ('张自忠路', '5号线')}, '和平里北街': {('雍和宫', '5号线'), ('和平西桥', '5号线')}, '和平西桥': {('光熙门', '12号线'), ('和平里北街', '5号线'), ('惠新西街南口', '5号线')}, '惠新西街南口': {('惠新西街北口', '5号线'), ('芍药居', '10号线外环'), ('芍药居', '10号线内环'), ('和平西桥', '5号线'), ('安贞门', '10号线内环'), ('安贞门', '10号线外环')}, '惠新西街北口': {('大屯路东', '5号线'), ('惠新西街南口', '5号线')}, '大屯路东': {('北苑路北', '5号线'), ('惠新西街北口', '5号线'), ('安立路', '15号线'), ('关庄', '15号线')}, '北苑路北': {('立水桥南', '5号线'), ('大屯路东', '5号线')}, '立水桥南': {('北苑路北', '5号线'), ('立水桥', '5号线')}, '立水桥': {('北苑', '13号线'), ('立水桥南', '5号线'), ('霍营', '13号线'), ('天通苑南', '5号线')}, '天通苑南': {('天通苑', '5号线'), ('立水桥', '5号线')}, '天通苑': {('天通苑北', '5号线'), ('天通苑南', '5号线')}, '天通苑北': {('天通苑', '5号线')}, '金安桥': {('四道桥', 'S1号线'), ('杨庄', '6号线')}, '杨庄': {('西黄村', '6号线'), ('金安桥', '6号线')}, '西黄村': {('廖公庄', '6号线'), ('杨庄', '6号线')}, '廖公庄': {('西黄村', '6号线'), ('田村', '6号线')}, '田村': {('廖公庄', '6号线'), ('海淀五路居', '6号线')}, '海淀五路居': {('慈寿寺', '6号线'), ('田村', '6号线')}, '慈寿寺': {('海淀五路居', '6号线'), ('西钓鱼台', '10号线内环'), ('西钓鱼台', '10号线外环'), ('车道沟', '10号线内环'), ('车道沟', '10号线外环'), ('花园桥', '6号线')}, '花园桥': {('慈寿寺', '6号线'), ('白石桥南', '6号线')}, '白石桥南': {('国家图书馆', '9号线'), ('花园桥', '6号线'), ('车公庄西', '6号线'), ('白堆子', '9号线')}, '车公庄西': {('车公庄', '6号线'), ('白石桥南', '6号线')}, '北海北': {('平安里', '6号线'), ('南锣鼓巷', '6号线')}, '南锣鼓巷': {('东四', '6号线'), ('中国美术馆', '8号线北'), ('北海北', '6号线'), ('什刹海', '8号线北')}, '东大桥': {('呼家楼', '6号线'), ('朝阳门', '6号线')}, '呼家楼': {('东大桥', '6号线'), ('金台夕照', '10号线内环'), ('金台夕照', '10号线外环'), ('金台路', '6号线'), ('团结湖', '10号线内环'), ('团结湖', '10号线外环')}, '金台路': {('呼家楼', '6号线'), ('十里堡', '6号线'), ('朝阳公园', '14号线东段'), ('大望路', '14号线东段')}, '十里堡': {('金台路', '6号线'), ('青年路', '6号线')}, '青年路': {('十里堡', '6号线'), ('褡裢坡', '6号线')}, '褡裢坡': {('黄渠', '6号线'), ('青年路', '6号线')}, '黄渠': {('褡裢坡', '6号线'), ('常营', '6号线')}, '常营': {('草房', '6号线'), ('黄渠', '6号线')}, '草房': {('物资学院路', '6号线'), ('常营', '6号线')}, '物资学院路': {('草房', '6号线'), ('通州北关', '6号线')}, '通州北关': {('北运河西', '6号线'), ('物资学院路', '6号线')}, '北运河西': {('北运河东', '6号线'), ('通州北关', '6号线')}, '北运河东': {('北运河西', '6号线'), ('郝家府', '6号线')}, '郝家府': {('北运河东', '6号线'), ('东夏园', '6号线')}, '东夏园': {('潞城', '6号线'), ('郝家府', '6号线')}, '潞城': {('东夏园', '6号线')}, '北京西站': {('军事博物馆', '9号线'), ('六里桥东', '9号线'), ('湾子', '7号线')}, '湾子': {('达官营', '7号线'), ('北京西站', '7号线')}, '达官营': {('广安门内', '7号线'), ('湾子', '7号线')}, '广安门内': {('菜市口', '7号线'), ('达官营', '7号线')}, '虎坊桥': {('珠市口', '7号线'), ('菜市口', '7号线')}, '珠市口': {('虎坊桥', '7号线'), ('桥湾', '7号线'), ('天桥', '8号线南')}, '桥湾': {('磁器口', '7号线'), ('珠市口', '7号线')}, '广渠门内': {('磁器口', '7号线'), ('广渠门外', '7号线')}, '广渠门外': {('广渠门内', '7号线'), ('双井', '7号线')}, '双井': {('国贸', '10号线内环'), ('国贸', '10号线外环'), ('劲松', '10号线内环'), ('劲松', '10号线外环'), ('九龙山', '7号线'), ('广渠门外', '7号线')}, '九龙山': {('双井', '7号线'), ('大望路', '14号线东段'), ('北工大西门', '14号线东段'), ('大郊亭', '7号线')}, '大郊亭': {('百子湾', '7号线'), ('九龙山', '7号线')}, '百子湾': {('化工', '7号线'), ('大郊亭', '7号线')}, '化工': {('百子湾', '7号线'), ('南楼梓庄', '7号线')}, '南楼梓庄': {('欢乐谷景区', '7号线'), ('化工', '7号线')}, '欢乐谷景区': {('南楼梓庄', '7号线'), ('垡头', '7号线')}, '垡头': {('双合', '7号线'), ('欢乐谷景区', '7号线')}, '双合': {('焦化厂', '7号线'), ('垡头', '7号线')}, '焦化厂': {('黄厂', '7号线'), ('双合', '7号线')}, '黄厂': {('焦化厂', '7号线'), ('郎辛庄', '7号线')}, '郎辛庄': {('黄厂', '7号线'), ('黑庄户', '7号线')}, '黑庄户': {('万盛西', '7号线'), ('郎辛庄', '7号线')}, '万盛西': {('万盛东', '7号线'), ('黑庄户', '7号线')}, '万盛东': {('万盛西', '7号线'), ('群芳', '7号线')}, '群芳': {('高楼金', '7号线'), ('万盛东', '7号线')}, '高楼金': {('群芳', '7号线'), ('花庄', '7号线')}, '花庄': {('高楼金', '7号线'), ('土桥', '八通线')}, '瀛海': {('德茂', '8号线南')}, '德茂': {('五福堂', '8号线南'), ('瀛海', '8号线南')}, '五福堂': {('火箭万源', '8号线南'), ('德茂', '8号线南')}, '火箭万源': {('五福堂', '8号线南'), ('东高地', '8号线南')}, '东高地': {('和义', '8号线南'), ('火箭万源', '8号线南')}, '和义': {('大红门南', '8号线南'), ('东高地', '8号线南')}, '大红门南': {('海户屯', '8号线南'), ('和义', '8号线南')}, '海户屯': {('木樨园', '8号线南'), ('大红门南', '8号线南')}, '木樨园': {('海户屯', '8号线南'), ('永定门外', '8号线南')}, '永定门外': {('景泰', '14号线东段'), ('北京南站', '14号线东段'), ('天桥', '8号线南'), ('木樨园', '8号线南')}, '天桥': {('珠市口', '8号线南'), ('永定门外', '8号线南')}, '朱辛庄': {('巩华城', '昌平线'), ('生命科学园', '昌平线'), ('育知路', '8号线北')}, '育知路': {('平西府', '8号线北'), ('朱辛庄', '8号线北')}, '平西府': {('回龙观东大街', '8号线北'), ('育知路', '8号线北')}, '回龙观东大街': {('平西府', '8号线北'), ('霍营', '8号线北')}, '霍营': {('回龙观', '13号线'), ('回龙观东大街', '8号线北'), ('育新', '8号线北'), ('立水桥', '13号线')}, '育新': {('西小口', '8号线北'), ('霍营', '8号线北')}, '西小口': {('永泰庄', '8号线北'), ('育新', '8号线北')}, '永泰庄': {('西小口', '8号线北'), ('林萃桥', '8号线北')}, '林萃桥': {('永泰庄', '8号线北'), ('森林公园南门', '8号线北')}, '森林公园南门': {('奥林匹克公园', '8号线北'), ('林萃桥', '8号线北')}, '奥林匹克公园': {('北沙滩', '15号线'), ('安立路', '15号线'), ('奥体中心', '8号线北'), ('森林公园南门', '8号线北')}, '奥体中心': {('北土城', '8号线北'), ('奥林匹克公园', '8号线北')}, '北土城': {('奥体中心', '8号线北'), ('安华桥', '8号线北'), ('健德门', '10号线内环'), ('健德门', '10号线外环'), ('安贞门', '10号线内环'), ('安贞门', '10号线外环')}, '安华桥': {('安德里北街', '8号线北'), ('北土城', '8号线北')}, '安德里北街': {('安华桥', '8号线北'), ('鼓楼大街', '8号线北')}, '什刹海': {('南锣鼓巷', '8号线北'), ('鼓楼大街', '8号线北')}, '中国美术馆': {('东四', '3号线'), ('南锣鼓巷', '8号线北')}, '郭公庄': {('丰台科技园', '9号线'), ('大葆台', '房山线')}, '丰台科技园': {('科怡路', '9号线'), ('郭公庄', '9号线')}, '科怡路': {('丰台科技园', '9号线'), ('丰台南路', '9号线')}, '丰台南路': {('丰台东大街', '9号线'), ('科怡路', '9号线')}, '丰台东大街': {('七里庄', '9号线'), ('丰台南路', '9号线')}, '七里庄': {('丰台东大街', '9号线'), ('西局', '14号线（西段）'), ('大井', '14号线（西段）'), ('六里桥', '9号线')}, '六里桥': {('六里桥东', '9号线'), ('陶然亭', '11号线'), ('七里庄', '9号线'), ('莲花桥', '10号线外环'), ('莲花桥', '10号线内环'), ('西局', '10号线内环'), ('西局', '10号线外环')}, '六里桥东': {('北京西站', '9号线'), ('六里桥', '9号线')}, '白堆子': {('军事博物馆', '9号线'), ('白石桥南', '9号线')}, '巴沟': {('火器营', '10号线外环'), ('颐和园西门', '西郊线'), ('苏州街', '10号线内环')}, '苏州街': {('巴沟', '10号线内环'), ('海淀黄庄', '10号线外环'), ('海淀黄庄', '10号线内环')}, '知春里': {('海淀黄庄', '10号线外环'), ('知春路', '10号线外环'), ('海淀黄庄', '10号线内环'), ('知春路', '10号线内环')}, '知春路': {('大钟寺', '13号线'), ('西土城', '10号线外环'), ('五道口', '13号线'), ('知春里', '10号线内环'), ('知春里', '10号线外环'), ('西土城', '10号线内环')}, '西土城': {('知春路', '10号线外环'), ('牡丹园', '10号线内环'), ('牡丹园', '10号线外环'), ('知春路', '10号线内环')}, '牡丹园': {('西土城', '10号线内环'), ('健德门', '10号线内环'), ('健德门', '10号线外环'), ('西土城', '10号线外环')}, '健德门': {('牡丹园', '10号线内环'), ('牡丹园', '10号线外环'), ('北土城', '10号线内环'), ('北土城', '10号线外环')}, '安贞门': {('惠新西街南口', '10号线内环'), ('惠新西街南口', '10号线外环'), ('北土城', '10号线内环'), ('北土城', '10号线外环')}, '芍药居': {('太阳宫', '10号线内环'), ('太阳宫', '10号线外环'), ('惠新西街南口', '10号线内环'), ('光熙门', '13号线'), ('惠新西街南口', '10号线外环'), ('望京西', '13号线')}, '太阳宫': {('三元桥', '10号线外环'), ('芍药居', '10号线外环'), ('芍药居', '10号线内环'), ('三元桥', '10号线内环')}, '三元桥': {('T3航站楼', '首都机场线'), ('亮马桥', '10号线外环'), ('亮马桥', '10号线内环'), ('太阳宫', '10号线内环'), ('东直门', '首都机场线'), ('太阳宫', '10号线外环')}, '亮马桥': {('农业展览馆', '10号线外环'), ('三元桥', '10号线外环'), ('农业展览馆', '10号线内环'), ('三元桥', '10号线内环')}, '农业展览馆': {('团结湖', '10号线内环'), ('团结湖', '10号线外环'), ('亮马桥', '10号线外环'), ('亮马桥', '10号线内环')}, '团结湖': {('农业展览馆', '10号线外环'), ('农业展览馆', '10号线内环'), ('呼家楼', '10号线外环'), ('朝阳公园', '3号线'), ('呼家楼', '10号线内环')}, '金台夕照': {('国贸', '10号线外环'), ('国贸', '10号线内环'), ('呼家楼', '10号线内环'), ('呼家楼', '10号线外环')}, '劲松': {('潘家园', '10号线外环'), ('双井', '10号线外环'), ('双井', '10号线内环'), ('天坛东门', '11号线'), ('平乐园', '11号线'), ('潘家园', '10号线内环')}, '潘家园': {('十里河', '10号线内环'), ('十里河', '10号线外环'), ('劲松', '10号线外环'), ('劲松', '10号线内环')}, '十里河': {('潘家园', '10号线外环'), ('方庄', '14号线东段'), ('分钟寺', '10号线外环'), ('分钟寺', '10号线内环'), ('潘家园', '10号线内环'), ('北工大西门', '14号线东段')}, '分钟寺': {('十里河', '10号线内环'), ('十里河', '10号线外环'), ('成寿寺', '10号线内环'), ('成寿寺', '10号线外环')}, '成寿寺': {('宋家庄', '10号线内环'), ('宋家庄', '10号线外环'), ('分钟寺', '10号线外环'), ('分钟寺', '10号线内环')}, '石榴庄': {('大红门', '10号线内环'), ('宋家庄', '10号线内环'), ('宋家庄', '10号线外环'), ('大红门', '10号线外环')}, '大红门': {('角门东', '10号线外环'), ('角门东', '10号线内环'), ('石榴庄', '10号线外环'), ('石榴庄', '10号线内环')}, '角门东': {('大红门', '10号线内环'), ('角门西', '10号线外环'), ('大红门', '10号线外环'), ('角门西', '10号线内环')}, '草桥': {('纪家庙', '10号线内环'), ('纪家庙', '10号线外环'), ('角门西', '10号线内环'), ('大兴新城', '大兴机场线'), ('角门西', '10号线外环')}, '纪家庙': {('首经贸', '10号线内环'), ('首经贸', '10号线外环'), ('草桥', '10号线内环'), ('草桥', '10号线外环')}, '首经贸': {('纪家庙', '10号线内环'), ('纪家庙', '10号线外环'), ('丰台', '10号线外环'), ('丰台', '10号线内环')}, '丰台': {('首经贸', '10号线外环'), ('泥洼', '10号线外环'), ('泥洼', '10号线内环'), ('首经贸', '10号线内环')}, '泥洼': {('西局', '10号线外环'), ('西局', '10号线内环'), ('丰台', '10号线外环'), ('丰台', '10号线内环')}, '西局': {('泥洼', '10号线内环'), ('泥洼', '10号线外环'), ('六里桥', '10号线内环'), ('六里桥', '10号线外环'), ('七里庄', '14号线（西段）')}, '莲花桥': {('六里桥', '10号线内环'), ('公主坟', '10号线外环'), ('六里桥', '10号线外环'), ('公主坟', '10号线内环')}, '西钓鱼台': {('慈寿寺', '10号线内环'), ('公主坟', '10号线外环'), ('慈寿寺', '10号线外环'), ('公主坟', '10号线内环')}, '车道沟': {('长春桥', '10号线内环'), ('慈寿寺', '10号线外环'), ('长春桥', '10号线外环'), ('慈寿寺', '10号线内环')}, '长春桥': {('火器营', '10号线内环'), ('车道沟', '10号线内环'), ('火器营', '10号线外环'), ('车道沟', '10号线外环')}, '火器营': {('长春桥', '10号线内环'), ('巴沟', '10号线外环'), ('长春桥', '10号线外环')}, '大钟寺': {('知春路', '13号线'), ('西直门', '13号线')}, '五道口': {('知春路', '13号线'), ('上地', '13号线')}, '上地': {('五道口', '13号线'), ('清河', '13号线')}, '清河': {('西二旗', '13号线'), ('上地', '13号线')}, '西二旗': {('龙泽', '13号线'), ('生命科学园', '昌平线'), ('清河', '13号线')}, '龙泽': {('回龙观', '13号线'), ('西二旗', '13号线')}, '回龙观': {('龙泽', '13号线'), ('霍营', '13号线')}, '北苑': {('望京西', '13号线'), ('立水桥', '13号线')}, '望京西': {('芍药居', '13号线'), ('北苑', '13号线'), ('望京', '15号线'), ('关庄', '15号线')}, '光熙门': {('芍药居', '13号线'), ('和平西桥', '12号线'), ('柳芳', '13号线')}, '柳芳': {('东直门', '13号线'), ('光熙门', '13号线')}, '景泰': {('永定门外', '14号线东段'), ('蒲黄榆', '14号线东段')}, '方庄': {('十里河', '14号线东段'), ('蒲黄榆', '14号线东段')}, '北工大西门': {('十里河', '14号线东段'), ('九龙山', '14号线东段')}, '朝阳公园': {('金台路', '14号线东段'), ('团结湖', '3号线'), ('枣营', '14号线东段')}, '枣营': {('朝阳公园', '14号线东段'), ('东风北桥', '14号线东段')}, '东风北桥': {('将台', '14号线东段'), ('枣营', '14号线东段')}, '将台': {('望京南', '14号线东段'), ('东风北桥', '14号线东段')}, '望京南': {('将台', '14号线东段'), ('阜通', '14号线东段')}, '阜通': {('望京南', '14号线东段'), ('望京', '14号线东段')}, '望京': {('东湖渠', '14号线东段'), ('望京西', '15号线'), ('阜通', '14号线东段'), ('望京东', '15号线')}, '东湖渠': {('望京', '14号线东段'), ('来广营', '14号线东段')}, '来广营': {('东湖渠', '14号线东段'), ('善各庄', '14号线东段')}, '善各庄': {('来广营', '14号线东段')}, '张郭庄': {('园博园', '14号线（西段）')}, '园博园': {('张郭庄', '14号线（西段）'), ('大瓦窑', '14号线（西段）')}, '大瓦窑': {('郭庄子', '14号线（西段）'), ('园博园', '14号线（西段）')}, '郭庄子': {('大井', '14号线（西段）'), ('大瓦窑', '14号线（西段）')}, '大井': {('七里庄', '14号线（西段）'), ('郭庄子', '14号线（西段）')}, '俸伯': {('顺义', '15号线')}, '顺义': {('石门', '15号线'), ('俸伯', '15号线')}, '石门': {('南法信', '15号线'), ('顺义', '15号线')}, '南法信': {('石门', '15号线'), ('后沙峪', '15号线')}, '后沙峪': {('南法信', '15号线'), ('花梨坎', '15号线')}, '花梨坎': {('后沙峪', '15号线'), ('国展', '15号线')}, '国展': {('孙河', '15号线'), ('花梨坎', '15号线')}, '孙河': {('马泉营', '15号线'), ('国展', '15号线')}, '马泉营': {('孙河', '15号线'), ('崔各庄', '15号线')}, '崔各庄': {('马泉营', '15号线'), ('望京东', '15号线')}, '望京东': {('望京', '15号线'), ('崔各庄', '15号线')}, '关庄': {('望京西', '15号线'), ('大屯路东', '15号线')}, '安立路': {('奥林匹克公园', '15号线'), ('大屯路东', '15号线')}, '北沙滩': {('奥林匹克公园', '15号线'), ('六道口', '15号线')}, '六道口': {('清华东路西口', '15号线'), ('北沙滩', '15号线')}, '清华东路西口': {('六道口', '15号线')}, '农大南路': {('西苑', '16号线'), ('马连洼', '16号线')}, '马连洼': {('西北旺', '16号线'), ('农大南路', '16号线')}, '西北旺': {('永丰南', '16号线'), ('马连洼', '16号线')}, '永丰南': {('西北旺', '16号线'), ('永丰', '16号线')}, '永丰': {('永丰南', '16号线'), ('屯佃', '16号线')}, '屯佃': {('稻香湖路', '16号线'), ('永丰', '16号线')}, '稻香湖路': {('温阳路', '16号线'), ('屯佃', '16号线')}, '温阳路': {('稻香湖路', '16号线'), ('北安河', '16号线')}, '北安河': {('温阳路', '16号线')}, '四道桥': {('金安桥', 'S1号线'), ('桥户营', 'S1号线')}, '桥户营': {('四道桥', 'S1号线'), ('上岸', 'S1号线')}, '上岸': {('栗园庄', 'S1号线'), ('桥户营', 'S1号线')}, '栗园庄': {('上岸', 'S1号线'), ('小园', 'S1号线')}, '小园': {('石厂', 'S1号线'), ('栗园庄', 'S1号线')}, '石厂': {('小园', 'S1号线')}, '延庆': {('八达岭', 'S2号线')}, '八达岭': {('延庆', 'S2号线'), ('南口', 'S2号线')}, '南口': {('黄土店', 'S2号线'), ('八达岭', 'S2号线')}, '黄土店': {('南口', 'S2号线')}, '高碑店': {('传媒大学', '八通线'), ('四惠东', '八通线')}, '传媒大学': {('双桥', '八通线'), ('高碑店', '八通线')}, '双桥': {('传媒大学', '八通线'), ('管庄', '八通线')}, '管庄': {('八里桥', '八通线'), ('双桥', '八通线')}, '八里桥': {('管庄', '八通线'), ('通州北苑', '八通线')}, '通州北苑': {('果园', '八通线'), ('八里桥', '八通线')}, '果园': {('九棵树', '八通线'), ('通州北苑', '八通线')}, '九棵树': {('梨园', '八通线'), ('果园', '八通线')}, '梨园': {('九棵树', '八通线'), ('临河里', '八通线')}, '临河里': {('梨园', '八通线'), ('土桥', '八通线')}, '土桥': {('花庄', '八通线'), ('临河里', '八通线')}, '昌平西山口': {('十三陵景区', '昌平线')}, '十三陵景区': {('昌平', '昌平线'), ('昌平西山口', '昌平线')}, '昌平': {('昌平东关', '昌平线'), ('十三陵景区', '昌平线')}, '昌平东关': {('北邵洼', '昌平线'), ('昌平', '昌平线')}, '北邵洼': {('南邵', '昌平线'), ('昌平东关', '昌平线')}, '南邵': {('北邵洼', '昌平线'), ('沙河高教园', '昌平线')}, '沙河高教园': {('南邵', '昌平线'), ('沙河', '昌平线')}, '沙河': {('巩华城', '昌平线'), ('沙河高教园', '昌平线')}, '巩华城': {('朱辛庄', '昌平线'), ('沙河', '昌平线')}, '生命科学园': {('西二旗', '昌平线'), ('朱辛庄', '昌平线')}, '大兴新城': {('草桥', '大兴机场线'), ('大兴机场', '大兴机场线')}, '大兴机场': {('大兴新城', '大兴机场线')}, '阎村东': {('苏庄', '房山线'), ('紫草坞', '燕房线')}, '苏庄': {('良乡南关', '房山线'), ('阎村东', '房山线')}, '良乡南关': {('苏庄', '房山线'), ('良乡大学城西', '房山线')}, '良乡大学城西': {('良乡南关', '房山线'), ('良乡大学城', '房山线')}, '良乡大学城': {('良乡大学城西', '房山线'), ('良乡大学城北', '房山线')}, '良乡大学城北': {('良乡大学城', '房山线'), ('广阳城', '房山线')}, '广阳城': {('篱笆房', '房山线'), ('良乡大学城北', '房山线')}, '篱笆房': {('长阳', '房山线'), ('广阳城', '房山线')}, '长阳': {('篱笆房', '房山线'), ('稻田', '房山线')}, '稻田': {('长阳', '房山线'), ('大葆台', '房山线')}, '大葆台': {('郭公庄', '房山线'), ('稻田', '房山线')}, 'T3航站楼': {('T2航站楼', '首都机场线'), ('三元桥', '首都机场线')}, 'T2航站楼': {('T3航站楼', '首都机场线')}, '香山': {('植物园', '西郊线')}, '植物园': {('万安', '西郊线'), ('香山', '西郊线')}, '万安': {('植物园', '西郊线'), ('茶棚', '西郊线')}, '茶棚': {('颐和园西门', '西郊线'), ('万安', '西郊线')}, '颐和园西门': {('巴沟', '西郊线'), ('茶棚', '西郊线')}, '紫草坞': {('阎村', '燕房线'), ('阎村东', '燕房线')}, '阎村': {('紫草坞', '燕房线'), ('星城', '燕房线')}, '星城': {('大石河东', '燕房线'), ('阎村', '燕房线')}, '大石河东': {('星城', '燕房线'), ('马各庄', '燕房线')}, '马各庄': {('大石河东', '燕房线'), ('饶乐府', '燕房线')}, '饶乐府': {('马各庄', '燕房线'), ('房山城关', '燕房线')}, '房山城关': {('燕山', '燕房线'), ('饶乐府', '燕房线')}, '燕山': {('房山城关', '燕房线')}, '肖村': {('小红门', '亦庄线'), ('宋家庄', '亦庄线')}, '小红门': {('肖村', '亦庄线'), ('旧宫', '亦庄线')}, '旧宫': {('小红门', '亦庄线'), ('亦庄桥', '亦庄线')}, '亦庄桥': {('亦庄文化园', '亦庄线'), ('旧宫', '亦庄线')}, '亦庄文化园': {('万源街', '亦庄线'), ('亦庄桥', '亦庄线')}, '万源街': {('荣京东街', '亦庄线'), ('亦庄文化园', '亦庄线')}, '荣京东街': {('万源街', '亦庄线'), ('荣昌东街', '亦庄线')}, '荣昌东街': {('荣京东街', '亦庄线'), ('同济南路', '亦庄线')}, '同济南路': {('经海路', '亦庄线'), ('荣昌东街', '亦庄线')}, '经海路': {('同济南路', '亦庄线'), ('次渠南', '亦庄线')}, '次渠南': {('经海路', '亦庄线'), ('次渠', '亦庄线')}, '次渠': {('亦庄火车站', '亦庄线'), ('次渠南', '亦庄线')}, '亦庄火车站': {('次渠', '亦庄线')}, '平乐园': {('劲松', '11号线')}}\n"
     ]
    }
   ],
   "source": [
    "# 获取北京市地铁线路连接关系\n",
    "station_connections = get_station_info(city_str='bj')\n",
    "print (station_connections)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 保存到文件\n",
    "def save_station_info(station_info, file_name='station_info.txt'):\n",
    "    f = open(file_name,\"a\",encoding='utf-8')\n",
    "    for station in station_info.keys():\n",
    "        neighbours = station_info[station]\n",
    "        line = station + ': {'\n",
    "        for neighbour, line_name in neighbours:\n",
    "            tail = '(' + neighbour + ',' + line_name + ')' + ','\n",
    "            line += tail\n",
    "        line = line[0:-1] + '}\\n'\n",
    "        # print(line)\n",
    "        f.write(line)\n",
    "    f.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [],
   "source": [
    "save_station_info(station_connections,file_name='station_info.txt')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 2. Preprocessing data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Some tips:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "a. Find a suitable way to save the data you get from the web. (Note: The way you use to save the data should be able to be used to create the graph that your agent is going to explore)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 读取文件\n",
    "f = open(\"station_dict.txt\",\"r\",encoding='utf-8')\n",
    "station_source = f.read()\n",
    "f.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 构建字典\n",
    "def get_station_info(station_source):\n",
    "    station_dict = {}\n",
    "    for line in station_source.split(\"\\n\"):\n",
    "        if line.startswith(\"//\"): continue\n",
    "        if line.strip() == \"\":continue\n",
    "        # print(line)    \n",
    "        # lineno = re.findall(\"\\d+\",line)[0]\n",
    "        # print(lineno)\n",
    "        station = re.findall(\"\\. (\\w+)\\:\",line)[0]\n",
    "        # print(station)\n",
    "        dsts = re.findall(\"\\:[\\ (\\w+)]+\",line)[0].split(' ')\n",
    "        dsts = dsts[1:-1]\n",
    "        # print(dsts)\n",
    "        station_dict[station] = dsts\n",
    "    return station_dict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 地铁站连接关系\n",
    "station_dict = get_station_info(station_source)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'苹果园': ['古城'],\n",
       " '古城': ['八角游乐园', '苹果园'],\n",
       " '八角游乐园': ['八宝山', '古城'],\n",
       " '八宝山': ['八角游乐园', '玉泉路'],\n",
       " '玉泉路': ['八宝山', '五棵松'],\n",
       " '五棵松': ['玉泉路', '万寿路'],\n",
       " '万寿路': ['公主坟', '五棵松'],\n",
       " '公主坟': ['西钓鱼台', '莲花桥', '万寿路', '军事博物馆'],\n",
       " '军事博物馆': ['北京西', '公主坟', '白堆子', '木樨地'],\n",
       " '木樨地': ['军事博物馆', '南礼士路'],\n",
       " '南礼士路': ['复兴门', '木樨地'],\n",
       " '复兴门': ['长椿街', '阜成门', '西单', '南礼士路'],\n",
       " '西单': ['复兴门', '天安门西'],\n",
       " '天安门西': ['天安门东', '西单'],\n",
       " '天安门东': ['天安门西', '王府井'],\n",
       " '王府井': ['天安门东', '东单'],\n",
       " '东单': ['建国门', '崇文门', '灯市口', '王府井'],\n",
       " '建国门': ['东单', '永安里', '北京', '朝阳门'],\n",
       " '永安里': ['建国门', '国贸'],\n",
       " '国贸': ['金台夕照', '双井', '永安里', '大望路'],\n",
       " '大望路': ['国贸', '四惠'],\n",
       " '四惠': ['四惠东', '大望路'],\n",
       " '四惠东': ['四惠'],\n",
       " '积水潭': ['西直门', '鼓楼大街'],\n",
       " '鼓楼大街': ['积水潭', '安定门', '什刹海', '安德里北街'],\n",
       " '安定门': ['雍和宫', '鼓楼大街'],\n",
       " '雍和宫': ['北新桥', '安定门', '东直门', '和平里北街'],\n",
       " '东直门': ['雍和宫', '东四十条', '柳芳'],\n",
       " '东四十条': ['东直门', '工人体育场', '朝阳门'],\n",
       " '朝阳门': ['东大桥', '建国门', '东四', '东四十条'],\n",
       " '北京': ['建国门', '崇文门'],\n",
       " '崇文门': ['磁器口', '东单', '北京', '前门'],\n",
       " '前门': ['和平门', '崇文门'],\n",
       " '和平门': ['宣武门', '前门'],\n",
       " '宣武门': ['和平门', '长椿街'],\n",
       " '长椿街': ['复兴门', '宣武门'],\n",
       " '阜成门': ['复兴门', '车公庄'],\n",
       " '车公庄': ['车公庄西', '西直门', '阜成门', '平安里'],\n",
       " '西直门': ['积水潭', '车公庄', '大钟寺'],\n",
       " '曹各庄北': ['高辛庄'],\n",
       " '高辛庄': ['曹各庄北', '楼梓庄'],\n",
       " '楼梓庄': ['楼梓庄桥西', '高辛庄'],\n",
       " '楼梓庄桥西': ['楼梓庄', '管庄路口西'],\n",
       " '管庄路口西': ['楼梓庄桥西', '东风'],\n",
       " '东风': ['东坝中街', '管庄路口西'],\n",
       " '东坝中街': ['平房村', '东风'],\n",
       " '平房村': ['东坝中街', '朝阳体育中心'],\n",
       " '朝阳体育中心': ['平房村', '星火'],\n",
       " '星火': ['朝阳体育中心', '石佛营'],\n",
       " '石佛营': ['星火', '朝阳公园'],\n",
       " '朝阳公园': ['团结湖', '石佛营'],\n",
       " '团结湖': ['农业展览馆', '工人体育场', '朝阳公园', '呼家楼'],\n",
       " '工人体育场': ['东四十条', '团结湖'],\n",
       " '天通苑北': ['天通苑'],\n",
       " '天通苑': ['天通苑南', '天通苑北'],\n",
       " '天通苑南': ['天通苑', '立水桥'],\n",
       " '立水桥': ['天通苑南', '北苑', '霍营', '立水桥南'],\n",
       " '立水桥南': ['北苑路北', '立水桥'],\n",
       " '北苑路北': ['大屯路东', '立水桥南'],\n",
       " '大屯路东': ['关庄', '北苑路北', '惠新西街北口', '安立路'],\n",
       " '惠新西街北口': ['惠新西街南口', '大屯路东'],\n",
       " '惠新西街南口': ['芍药居', '安贞门', '惠新西街北口', '和平西桥'],\n",
       " '和平西桥': ['和平里北街', '惠新西街南口'],\n",
       " '和平里北街': ['雍和宫', '和平西桥'],\n",
       " '北新桥': ['雍和宫', '张自忠路'],\n",
       " '张自忠路': ['北新桥', '东四'],\n",
       " '东四': ['张自忠路', '灯市口', '朝阳门', '南锣鼓巷'],\n",
       " '灯市口': ['东单', '东四'],\n",
       " '磁器口': ['天坛东门', '广渠门内', '桥湾', '崇文门'],\n",
       " '天坛东门': ['蒲黄榆', '磁器口'],\n",
       " '蒲黄榆': ['天坛东门', '刘家窑'],\n",
       " '刘家窑': ['宋家庄', '蒲黄榆'],\n",
       " '宋家庄': ['成寿寺', '刘家窑', '石榴庄'],\n",
       " '海淀五路居': ['慈寿寺'],\n",
       " '慈寿寺': ['花园桥', '海淀五路居', '西钓鱼台', '车道沟'],\n",
       " '花园桥': ['白石桥南', '慈寿寺'],\n",
       " '白石桥南': ['国家图书馆', '花园桥', '白堆子', '车公庄西'],\n",
       " '车公庄西': ['白石桥南', '车公庄'],\n",
       " '平安里': ['车公庄', '北海北'],\n",
       " '北海北': ['平安里', '南锣鼓巷'],\n",
       " '南锣鼓巷': ['什刹海', '东四', '北海北'],\n",
       " '东大桥': ['朝阳门', '呼家楼'],\n",
       " '呼家楼': ['东大桥', '金台夕照', '金台路', '团结湖'],\n",
       " '金台路': ['十里堡', '呼家楼'],\n",
       " '十里堡': ['金台路', '青年路'],\n",
       " '青年路': ['十里堡', '褡裢坡'],\n",
       " '褡裢坡': ['黄渠', '青年路'],\n",
       " '黄渠': ['褡裢坡', '常营'],\n",
       " '常营': ['黄渠', '草房'],\n",
       " '草房': ['物资学院路', '常营'],\n",
       " '物资学院路': ['通州北关', '草房'],\n",
       " '通州北关': ['物资学院路', '北运河西'],\n",
       " '北运河西': ['通州北关', '郝家府'],\n",
       " '郝家府': ['东夏园', '北运河西'],\n",
       " '东夏园': ['潞城', '郝家府'],\n",
       " '潞城': ['东夏园'],\n",
       " '北京西': ['六里桥东', '湾子', '军事博物馆'],\n",
       " '湾子': ['达官营', '北京西'],\n",
       " '达官营': ['广安门内', '湾子'],\n",
       " '广安门内': ['菜市口', '达官营'],\n",
       " '菜市口': ['广安门内', '虎坊桥'],\n",
       " '虎坊桥': ['菜市口', '珠市口'],\n",
       " '珠市口': ['桥湾', '虎坊桥'],\n",
       " '桥湾': ['珠市口', '磁器口'],\n",
       " '广渠门内': ['广渠门外', '磁器口'],\n",
       " '广渠门外': ['广渠门内', '九龙山'],\n",
       " '九龙山': ['大郊亭', '广渠门外'],\n",
       " '大郊亭': ['九龙山', '百子湾'],\n",
       " '百子湾': ['大郊亭', '化工'],\n",
       " '化工': ['百子湾', '南楼梓庄'],\n",
       " '南楼梓庄': ['化工', '欢乐谷景区'],\n",
       " '欢乐谷景区': ['双合', '南楼梓庄'],\n",
       " '双合': ['焦化厂', '欢乐谷景区'],\n",
       " '焦化厂': ['双合'],\n",
       " '什刹海': ['南锣鼓巷', '鼓楼大街'],\n",
       " '安德里北街': ['安华桥', '鼓楼大街'],\n",
       " '安华桥': ['北土城', '安德里北街'],\n",
       " '北土城': ['奥体中心', '安华桥', '安贞门', '健德门'],\n",
       " '奥体中心': ['奥林匹克公园', '北土城'],\n",
       " '奥林匹克公园': ['奥体中心', '森林公园南门', '北沙滩', '安立路'],\n",
       " '森林公园南门': ['奥林匹克公园', '林萃桥'],\n",
       " '林萃桥': ['永泰庄', '森林公园南门'],\n",
       " '永泰庄': ['西小口', '林萃桥'],\n",
       " '西小口': ['永泰庄', '育新'],\n",
       " '育新': ['西小口', '霍营'],\n",
       " '霍营': ['回龙观', '回龙观东大街', '育新', '立水桥'],\n",
       " '回龙观东大街': ['平西府', '霍营'],\n",
       " '平西府': ['回龙观东大街', '育知路'],\n",
       " '育知路': ['平西府', '朱辛庄'],\n",
       " '朱辛庄': ['育知路'],\n",
       " '郭公庄': ['丰台科技园'],\n",
       " '丰台科技园': ['郭公庄', '科怡路'],\n",
       " '科怡路': ['丰台南路', '丰台科技园'],\n",
       " '丰台南路': ['科怡路', '丰台东大街'],\n",
       " '丰台东大街': ['丰台南路', '七里庄'],\n",
       " '七里庄': ['六里桥', '大井', '丰台东大街', '西局'],\n",
       " '六里桥': ['西局', '莲花桥', '七里庄', '六里桥东'],\n",
       " '六里桥东': ['六里桥', '北京西'],\n",
       " '白堆子': ['白石桥南', '军事博物馆'],\n",
       " '国家图书馆': ['白石桥南'],\n",
       " '车道沟': ['长春桥', '慈寿寺'],\n",
       " '长春桥': ['火器营', '车道沟'],\n",
       " '火器营': ['巴沟', '长春桥'],\n",
       " '巴沟': ['苏州街', '火器营'],\n",
       " '苏州街': ['巴沟', '海淀黄庄'],\n",
       " '海淀黄庄': ['知春里', '苏州街'],\n",
       " '知春里': ['知春路', '海淀黄庄'],\n",
       " '知春路': ['知春里', '西土城', '大钟寺', '五道口'],\n",
       " '西土城': ['牡丹园', '知春路'],\n",
       " '牡丹园': ['西土城', '健德门'],\n",
       " '健德门': ['牡丹园', '北土城'],\n",
       " '安贞门': ['惠新西街南口', '北土城'],\n",
       " '芍药居': ['光熙门', '惠新西街南口', '太阳宫', '望京西'],\n",
       " '太阳宫': ['三元桥', '芍药居'],\n",
       " '三元桥': ['太阳宫', '亮马桥'],\n",
       " '亮马桥': ['农业展览馆', '三元桥'],\n",
       " '农业展览馆': ['亮马桥', '团结湖'],\n",
       " '金台夕照': ['国贸', '呼家楼'],\n",
       " '双井': ['国贸', '劲松'],\n",
       " '劲松': ['潘家园', '双井'],\n",
       " '潘家园': ['十里河', '劲松'],\n",
       " '十里河': ['潘家园', '分钟寺'],\n",
       " '分钟寺': ['成寿寺', '十里河'],\n",
       " '成寿寺': ['宋家庄', '分钟寺'],\n",
       " '石榴庄': ['宋家庄', '大红门'],\n",
       " '大红门': ['石榴庄', '角门东'],\n",
       " '角门东': ['角门西', '大红门'],\n",
       " '角门西': ['草桥', '角门东'],\n",
       " '草桥': ['角门西', '纪家庙'],\n",
       " '纪家庙': ['首经贸', '草桥'],\n",
       " '首经贸': ['丰台', '纪家庙'],\n",
       " '丰台': ['首经贸', '泥洼'],\n",
       " '泥洼': ['西局', '丰台'],\n",
       " '西局': ['六里桥', '七里庄', '泥洼'],\n",
       " '莲花桥': ['六里桥', '公主坟'],\n",
       " '西钓鱼台': ['公主坟', '慈寿寺'],\n",
       " '大钟寺': ['西直门', '知春路'],\n",
       " '五道口': ['知春路', '上地'],\n",
       " '上地': ['五道口', '西二旗'],\n",
       " '西二旗': ['上地', '龙泽'],\n",
       " '龙泽': ['回龙观', '西二旗'],\n",
       " '回龙观': ['霍营', '龙泽'],\n",
       " '北苑': ['立水桥', '望京西'],\n",
       " '望京西': ['望京', '北苑', '关庄', '芍药居'],\n",
       " '光熙门': ['柳芳', '芍药居'],\n",
       " '柳芳': ['光熙门', '东直门'],\n",
       " '张郭庄': ['园博园'],\n",
       " '园博园': ['大瓦窑', '张郭庄'],\n",
       " '大瓦窑': ['郭庄子', '园博园'],\n",
       " '郭庄子': ['大瓦窑', '大井'],\n",
       " '大井': ['郭庄子', '七里庄'],\n",
       " '清华东路西口': ['六道口'],\n",
       " '六道口': ['北沙滩', '清华东路西口'],\n",
       " '北沙滩': ['六道口', '奥林匹克公园'],\n",
       " '安立路': ['奥林匹克公园', '大屯路东'],\n",
       " '关庄': ['大屯路东', '望京西'],\n",
       " '望京': ['望京西', '望京东'],\n",
       " '望京东': ['望京', '崔各庄'],\n",
       " '崔各庄': ['马泉营', '望京东'],\n",
       " '马泉营': ['孙河', '崔各庄'],\n",
       " '孙河': ['马泉营', '国展'],\n",
       " '国展': ['花梨坎', '孙河'],\n",
       " '花梨坎': ['国展', '后沙峪'],\n",
       " '后沙峪': ['南法信', '花梨坎'],\n",
       " '南法信': ['后沙峪', '石门'],\n",
       " '石门': ['顺义', '南法信'],\n",
       " '顺义': ['俸伯', '石门'],\n",
       " '俸伯': ['顺义'],\n",
       " '北安河': ['温阳路'],\n",
       " '温阳路': ['北安河', '稻香湖'],\n",
       " '稻香湖': ['屯佃', '温阳路'],\n",
       " '屯佃': ['永丰', '稻香湖'],\n",
       " '永丰': ['屯佃', '永丰南'],\n",
       " '永丰南': ['永丰', '西北旺'],\n",
       " '西北旺': ['马连洼', '永丰南'],\n",
       " '马连洼': ['西苑', '西北旺'],\n",
       " '西苑': ['马连洼']}"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "station_dict"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3. Build the search agent"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Build the search agent based ont he graph you built."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "for example, if you use Beijing subway graoh, and you run:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\\>>> search(\"奥体中心“，”天安门“）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You should get the result as follows: 奥体中心 -> A ->B ->C ... -> 天安门"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 广度优先搜索\n",
    "def search_2(graph,start,destination,search_strategy):\n",
    "    pathes = [[start]]\n",
    "    visited = set()# ！\n",
    "    while pathes:\n",
    "        path = pathes.pop(0)\n",
    "        froniter = path[-1]\n",
    "        if froniter in visited : continue# ！\n",
    "            \n",
    "        if froniter == destination:# ！\n",
    "            return path# ！\n",
    "        \n",
    "        successsors = graph[froniter]\n",
    "        \n",
    "        for city in successsors:\n",
    "            if city in path: continue  # check loop\n",
    "            \n",
    "            new_path = path+[city]\n",
    "            \n",
    "            pathes.append(new_path)  #bfs\n",
    "            \n",
    "        pathes = search_strategy(pathes)\n",
    "        visited.add(froniter) # ！\n",
    "       # if pathes and (destination == pathes[0][-1]):\n",
    "       #     return pathes[0]  \n",
    "                            "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [],
   "source": [
    "def search(source,destination,station_dict=station_dict,search_strategy=lambda x:x):\n",
    "    path = search_2(station_dict,source,destination,search_strategy=lambda x:x)\n",
    "    result = ''\n",
    "    for node in path:\n",
    "        result += node\n",
    "        result += ' -> '\n",
    "    return result[0:-4]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'天通苑 -> 天通苑南 -> 立水桥 -> 北苑 -> 望京西 -> 芍药居 -> 光熙门 -> 柳芳 -> 东直门 -> 东四十条 -> 朝阳门 -> 建国门 -> 东单 -> 崇文门 -> 磁器口 -> 天坛东门 -> 蒲黄榆 -> 刘家窑'"
      ]
     },
     "execution_count": 144,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "search(\"天通苑\",\"刘家窑\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### (Optional) Improve your agent to make it able to find a path based on different strategies"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  <评阅点> : 是否正确得到不同目标下的路径。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Some ideas you might want to try:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "a. Find the shortest path between two stations."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "b. Find the path that requires minimum transfers between two stations."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "c. Combine the previous two ideas, find a more suitable path."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Compare your results with results obtained by using some apps such as Baidu map, A map, Google map or Apple map. If there is difference, try to explanate it."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Congratulations ! You have finished the assignment of week 2."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![title](img/agent.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### If you have any suggestions regarding the teaching, please feel free to send them to my eamil (eric.lee.xiao@gmail.com) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
